@FetchRequest SwiftUI-də — bu nədir, Core Data seçimi və mexanizm

Müəllif: IT Sectr Dərc olunub: 2026-06-25 Oxuma vaxtı: 8 dəq

@FetchRequest SwiftUI-də — Core Data-dan avtomatik məlumat seçimi üçün property wrapper, interfeysin reaktiv yenilənməsi ilə. Wrapper filtrləmə predikatları və çeşidləmələrlə NSFetchRequest qəbul edir, nəticə — NSManagedObject massivi — Core Data kontekstindəki hər hansı dəyişiklikdə avtomatik yenilənir. Apple Developer Documentation (2025)-yə görə, @FetchRequest SwiftUI mühitində managedObjectContext tələb edir və dinamik predikatları dəstəkləyir, Core Data ilə istifadəçi interfeysi arasında reaktiv əlaqə təmin edir.

Əsas məqamlar

  • @FetchRequest — SwiftUI-də Core Data-nın reaktiv seçimi üçün property wrapper
  • Avtomatik yenilənmə UI Core Data-da qeydlərin əlavə edilməsi, silinməsi və ya dəyişdirilməsi zamanı
  • Predikatlar və çeşidləmələr inicializatorda və ya property wrapper parametrləri ilə təyin edilir
  • managedObjectContext View iyerarxiyasında @Environment vasitəsilə mövcud olmalıdır
  • Dinamik predikatlar iş vaxtı filtrləmə řərtlərini dəyişməyə imkan verir

SwiftUI-də @FetchRequest nədir?

@FetchRequest — Core Data-dan FetchRequest yaradan və idarə edən SwiftUI property wrapper-ıdır. İnitializasiya zamanı wrapper varlıq növünü, çeşidləmə üçün NSSortDescriptor massivini və isteğə bağlı filtrləmə üçün NSPredicate qəbul edir. Nəticə müəyyən edilmiş NSManagedObject növünün obyektləri massivi kimi saxlanılır və davamlılıq qatındakı dəyişikliklərdə avtomatik yenilənir.

@FetchRequest-in əsas xüsusiyyəti reaktivlikdir. Core Data-dakı məlumatlar dəyişdikdə (save, insert, delete, update), SwiftUI avtomatik olaraq təkrari seçim edir və bu fetch request-dən istifadə edən bütün View-ləri yenidən çəkir. Tərtibatçı əl ilə refresh çağırmalı, NSManagedObjectContextDidSaveNotification-a abunə olmalı və ya məlumatları yenidən yükləməli deyil. SwiftUI bütün sinxronizasiya dövrünü idarə edir.

@FetchRequest-in işləməsi üçün @Environment su(\.managedObjectContext) vasitəsilə SwiftUI mühitində NSManagedObjectContext mövcud olmalıdır. Kontekst adətən NSPersistentContainer-ın yaradıldığı tətbiqin kökündən ötürülür. Standart nümunə — Core Data stack-ını konfiqurasiya etmək və .environment() modifikatoru vasitəsilə konteksti ötürmək üçün ViewModel və ya App strukturu istifadə etməkdir.

FetchRequest çeşidləmə və predikatları

@FetchRequest seçimi konfiqurasiya etmək üçün bir neçə parametr qəbul edir. SortDescriptors — qeydlərin sırasını təyin edən NSSortDescriptor massivi. Predicate — filtrləmə üçün NSPredicate, məsələn, yalnız statusu „tamamlandı” olan tapşırıqları seçmək. Animation — məlumat dəyişikliklərində siyahının yenilənməsi üçün animasiya.

Core Data predikatları SQL-ə bənzər ifadə formatından istifadə edir: NSPredicate(format: „status == %@”, „completed”). Bir neçə şərt AND, OR və NOT ilə birləşdirilə bilər. SortDescriptors sıranı təyin edir: NSSortDescriptor(keyPath: suTask.dueDate, ascending: true). Bir neçə sahə üzrə çeşidləmə üçün deskriptorlar massivi ötürülür — birinci əsas, qalanları ikinci dərəcəli olaraq tətbiq edilir.

swift
struct TaskListView: View {
    @Environment(\.managedObjectContext) var viewContext

    @FetchRequest(
        sortDescriptors: [
            NSSortDescriptor(keyPath: \.Task.dueDate, ascending: true),
            NSSortDescriptor(keyPath: \.Task.priority, ascending: false)
        ],
        predicate: NSPredicate(format: "isCompleted == NO"),
        animation: .default
    )
    var tasks: FetchedResults<Task>

    var body: some View {
        List(tasks) { task in
            Text(task.title ?? "")
        }
    }
}

Nümunədə @FetchRequest bütün tamamlanmamış tapşırıqları (isCompleted == NO) seçir, əvvəlcə tarixə görə (artan), sonra prioritetə görə (azalan) çeşidləyir. FetchedResults<Task> — ForEach və List üçün massiv kimi davranan avtomatik yenilənən kolleksiyadır. .default animasiyası dəyişikliklərdə qeydlərin hamar görünməsini/yox olmasını təmin edir.

@FetchRequest List və dinamik məlumatlarla

@FetchRequest dinamik Core Data siyahılarını göstərmək üçün List və ForEach ilə mükəmməl birləşir. Seçim nəticəsi (FetchedResults) RandomAccessCollection protokoluna uyğundur, buna görə də birbaşa List və ForEach-də istifadə edilə bilər. Qeydlər əlavə edildikdə, silindikdə və ya dəyişdirildikdə, siyahı avtomatik olaraq animasiya ilə yenidən çəkilir.

Qeydləri silmək üçün kontekstin delete metodundan istifadə olunur. Əlavə etmək üçün — yeni NSManagedObject yaradılır və save çağrılır. Bütün dəyişikliklər @FetchRequest ilə birlikdə məlumatların ardıcıllığını təmin edən viewContext vasitəsilə həyata keçirilir. Redaktə etmək üçün müəyyən Core Data obyekti üçün @ObservedObject və ya @Bindable istifadə olunur.

swift
struct TaskListWithActions: View {
    @Environment(\.managedObjectContext) var viewContext

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \.Task.createdAt,
                                               ascending: false)]
    )
    var tasks: FetchedResults<Task>

    var body: some View {
        List {
            ForEach(tasks) { task in
                HStack {
                    Text(task.title ?? "")
                    Spacer()
                    Image(systemName: task.isCompleted
                               ? "checkmark.circle.fill"
                               : "circle")
                }
                .onTapGesture { toggleTask(task) }
            }
            .onDelete(perform: deleteTasks)
        }
        .toolbar {
            Button(systemImage: "əlavə et") { addTask() }
        }
    }

    private func addTask() {
        let newTask = Task(context: viewContext)
        newTask.title = "New task \(tasks.count + 1)"
        newTask.createdAt = Date()
        try? viewContext.save()
    }

    private func toggleTask(_ task: Task) {
        task.isCompleted.toggle()
        try? viewContext.save()
    }

    private func deleteTasks(at offsets: IndexSet) {
        for index in offsets {
            viewContext.delete(tasks[index])
        }
        try? viewContext.save()
    }
}

Bu nümunə @FetchRequest ilə tam CRUD-ı nümayiş etdirir. Əlavə etmə: kontekst vasitəsilə Task yaratma və save(). Silmə: kontekstdə delete() və save(). Yeniləmə: xassənin toggle-ı və save(). Hər save()-dən sonra @FetchRequest avtomatik olaraq məlumatları yenidən sorğular və List animasiya ilə yenilənir. onDelete və onTapGesture modifikatorları standart iOS qarşılıqlı əlaqələrini təmin edir.

@FetchRequest kod nümunələri

@FetchRequest ilə qeydləri seçmək üçün jurnal tətbiqinin tam nümunəsinə baxaq. Axtarış forması dinamik predikatdan istifadə edir: mətn daxil edildikdə FetchRequest avtomatik olaraq nəticələri yeniləyir, qeydləri başlığa və məzmuna görə filtrləyir. Çeşidləmə — yaranma tarixinə görə, yenidən köhnəyə.

swift
struct JournalEntryView: View {
    @Environment(\.managedObjectContext) var viewContext
    @State private var searchText = ""

    private var searchPredicate: NSPredicate? {
        guard !searchText.isEmpty else { return nil }
        return NSPredicate(format: "title CONTAINS[c] %@", searchText)
    }

    @FetchRequest var entries: FetchedResults<JournalEntry>

    init(searchText: String) {
        let sort = [NSSortDescriptor(keyPath: \.JournalEntry.date,
                                           ascending: false)]
        let pred: NSPredicate? = searchText.isEmpty
            ? nil
            : NSPredicate(format: "title CONTAINS[c] %@ OR content CONTAINS[c] %@",
                          searchText, searchText)
        self._entries = FetchRequest(
            sortDescriptors: sort,
            predicate: pred,
            animation: .default
        )
    }

    var body: some View {
        List(entries) { entry in
            VStack(alignment: .leading) {
                Text(entry.title ?? "").font(.headline)
                Text(entry.content ?? "").font(.subheadline)
                    .lineLimit(2)
            }
        }
        .searchable(text: $searchText)
    }
}

Axtarışla qeyd jurnalı: searchable sahəsinə mətn daxil edildikdə NSPredicate title və content sahələrində CONTAINS[c] (böyük/kiçik hərflərə həssas olmayan axtarış) ilə yaradılır. Init searchText qəbul edir və müvafiq predikatla FetchRequest yaradır. Searchable modifikatoru avtomatik olaraq searchText-i yeniləyir, @FetchRequest isə predikatın dəyişməsinə reaksiya verir və məlumatları yenidən sorğular.

Çoxlu filtrlərlə daha mürəkkəb ssenarilər üçün NSCompoundPredicate-i AND/OR məntiqi ilə birləşdirin. @FetchRequest istənilən mürəkkəblikdə predikatları, o cümlədən əlaqələr üzrə filtrləmə üçün iç-içə alt sorğuları (SUBQUERY) dəstəkləyir. Ancaq unutmayın: mürəkkəb predikatlar performansa təsir edir — böyük məlumat dəstləri üçün (10 000-dən çox qeyd) Core Data indeksləməsindən istifadə edin və fetchLimit vasitəsilə seçimi məhdudlaşdırın.

İş vaxtı dinamik predikatlar

@FetchRequest iş vaxtı dəyişdirilə bilən predicate parametri vasitəsilə dinamik predikatları dəstəkləyir. Bunun üçün dəyişən-predikatla @FetchRequest yaratmalı və onu Binding vasitəsilə ötürməlisiniz. İstifadəçi filtri dəyişdikdə — məsələn, tapşırıq kateqoriyasını seçdikdə — predikat yenilənir və seçim avtomatik olaraq yenidən başladılır.

Dinamik predikatlar @State və ya @Published xassəsi vasitəsilə həyata keçirilir, bu da @FetchRequest inicializatoruna Binding kimi ötürülür. SwiftUI bu Binding-in dəyişməsini izləyir və yeni predikatla NSFetchRequest-i yenidən yaradır, siyahını avtomatik yeniləyir.

Tez-tez verilən suallar

managedObjectContext-i @FetchRequest-ə necə ötürmək olar?

Kök View-ə @Environment(\.managedObjectContext) var viewContext əlavə edin və onu .environment(\.managedObjectContext, context) modifikatoru vasitəsilə ötürün. @FetchRequest istifadə edən bütün uşaq View-lər avtomatik olaraq konteksti mühitdən alacaq.

@FetchRequest-i View-i yenidən yükləmədən yeniləmək olarmı?

Bəli, Core Data kontekstini dəyişdirin: obyekti əlavə edin, silin və ya yeniləyin və save() çağırın. @FetchRequest avtomatik olaraq təkrari seçim edəcək və UI-ı yeniləyəcək. Save() olmadan məcburi yeniləmə üçün viewContext.refreshAllObjects() istifadə edin.

@FetchRequest və @SectionedFetchRequest arasında fərq nədir?

@FetchRequest düz obyekt massivi qaytarır. @SectionedFetchRequest nəticələri göstərilən key path üzrə bölümələrə qruplaşdırır, UITableView-in sectionNameKeyPath ilə oxşardır. Bölüm başlıqları ilə grouped siyahılar üçün @SectionedFetchRequest istifadə edin.

@FetchRequest-i Relationship ilə necə istifadə etmək olar?

Əlaqələr üzrə filtrləmə üçün nöqtə notasiyasından istifadə edin: NSPredicate(format: „category.name == %@”, „Work”). @FetchRequest avtomatik olaraq SQLite-də JOIN yerinə yetirir. Seçilmiş obyekt vasitəsilə əlaqəyə giriş üçün adi NSManagedObject xassələrindən istifadə edin.

@FetchRequest səhifələməni dəstəkləyir?

@FetchRequest birbaşa səhifələməni dəstəkləmir, çünki o, reaktiv yeniləmə ilə bütün qeydləri göstərmək üçün nəzərdə tutulub. Səhifələmə üçün NSFetchRequest-dən fetchLimit/fetchOffset ilə istifadə edin və siyahını sürüşdürərkən məlumatları əl ilə yükləyin.

Xülasə

  • @FetchRequest — SwiftUI-də avtomatik reaktiv Core Data seçimi üçün property wrapper
  • Çeşidləmə NSSortDescriptor massivi ilə, filtrləmə — NSPredicate ilə təyin edilir
  • Avtomatik yenilənmə Core Data kontekstindəki istənilən məlumat dəyişikliyində UI
  • managedObjectContext View iyerarxiyasında @Environment vasitəsilə ötürülür
  • Dinamik predikatlar predikat parametri ilə xüsusi init vasitəsilə həyata keçirilir
  • CRUD əməliyyatları avtomatik siyahı sinxronizasiyası ilə viewContext vasitəsilə yerinə yetirilir
  • Core Data göstərmək üçün @FetchRequest, grouped siyahılar üçün @SectionedFetchRequest istifadə edin

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun