Giriş: Neden Core Data ve NSFetchedResultsController Madde

Modern iOS gelişiminde, bir sıvı, duyarlı kullanıcı arayüzü genellikle uygulamanızın zamanla değişen verileri nasıl verimli bir şekilde ele alması bağlıdır. Bir sosyal besleme, bir görev yöneticisi veya envanter sistemi, kullanıcıların görüntülediği veriler nadiren statik. Core Data – Apple'ın olgun nesne grafiği ve devam eden çerçevesi – çiftleştirilmiş bir şekilde.0)

Bu makale, Core Data ile ESFLT:1 ile ilgili ayrıntılı bir kılavuz sağlar.Rektör bildirimleri anahtardır. nesneler eklendiğinde, güncellenir veya silinir, bağlam yayınları bu değişiklikler, tam olarak UI tutarlılığını korumak için hangi.

Resmi geliştirici belgesi için, [[0) Apple'ın Core Data Framework Referansı[Dönetici:0)'a atıfta bulun.

NSFetchedResultsController: Core Data ve Your UI

[[DÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜ: A.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D., sonuçları bir Core Data toplama isteğinden verimli bir şekilde yönetmek için tasarlanmış bir kontrol nesnesidir, özellikle de temel verilerin değişmesi bekleniyor.

Anahtar Özellikler

  • [FONT:0)Otomatik değişim izleme: [Dönetici: ·[Döneticileri) FRC, onları yapısal delege çağrılarına çevirerek ([Dönemli: 4))) ►FLT:5.
  • [FONT:0)Built-in Bölüm:Bir [[DÜyetim 7) tarafından belirlenen kontrol grupları, bölümlerin içine alır ve tablo görüşlerini veya koleksiyon görüşlerini görüntülemek için önemsiz hale getirir.
  • [FONT:0)Performance optimizasyonu:[Dönetici:[Dönetici:0) FRC, yönetilen nesne bağlamı kurtarıldığında geri çekilmekten kaçınmaya yönelik verileri sadece gerekli hale getirir ve tercih edilebilir bir şekilde geri alma sağlar.

Detaylı

Kontrolücüden tamamen faydalanmak için, UI'yi toplu olarak indirmeniz gerekir. Örneğin: Örneğin, bu çağrıları bir şekilde kullanmak için en yaygın model bu çağrıları kullanmaktır.

func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
 tableView.beginUpdates()
}

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>,
 didChange anObject: Any,
 at indexPath: IndexPath?,
 for type: NSFetchedResultsChangeType,
 newIndexPath: IndexPath?) {
 switch type {
 case .insert:
 tableView.insertRows(at: [newIndexPath!], with: .fade)
 case .delete:
 tableView.deleteRows(at: [indexPath!], with: .fade)
 case .update:
 tableView.reloadRows(at: [indexPath!], with: .fade)
 case .move:
 tableView.moveRow(at: indexPath!, to: newIndexPath!)
 @unknown default:
 tableView.reloadData()
 }
}

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
 tableView.endUpdates()
}

Bu model, masanın altta yatan verilerle senkronize edilen değişiklikleri görmesini sağlar, flicker veya inconsistency'i önler.

Step-by-Step Uygulama

Aşağıda Swift 5 kullanarak tam, üretim hazır bir örnek, iOS 15+'yı hedefleyeceğim. ”Şerefli özelliklerle “Ücretsiz” (String) ve [[SEVT: 16)) ile basit bir varlık varsayacağız.

1. Core Data Stack'i ayarlayın

YourFLT:16 veya adanmış bir GÜNDÜŞEK ( SwiftUI uygulamaları ile) kalıcı konteyner yaratır:

class PersistenceController {
 static let shared = PersistenceController()
 let container: NSPersistentContainer

 init() {
 container = NSPersistentContainer(name: "YourModelName")
 container.loadPersistentStores { storeDescription, error in
 if let error = error as NSError? {
 fatalError("Unresolved error \(error), \(error.userInfo)")
 }
 }
 container.viewContext.automaticallyMergesChangesFromParent = true
 }
}

2. NSManagedObject Subclass'ı oluşturun

Xcode'un veri modelini sınıf dosyaları oluşturmak veya bunları manuel olarak oluşturmak için kullanın. Varlıklarınızı doğru sınıf modülü ayarı kullanır.

3. Fetch İstek ve FRC'yi yapılandırın

Bakış kontrolörünüzde, getirici sonuçları kontrol eden ve ilk olarak ortaya çıkan sonuçları kontrol edin. Bunu 444D:19'da gerçekleştirmek en iyisidir veya bir görüntü modelinin init.

lazy var fetchedResultsController: NSFetchedResultsController<Task> = {
 let fetchRequest: NSFetchRequest<Task> = Task.fetchRequest()
 let sortDescriptor = NSSortDescriptor(key: "dueDate", ascending: true)
 fetchRequest.sortDescriptors = [sortDescriptor]
 // Optional: limit results with batch size for large datasets
 fetchRequest.fetchBatchSize = 20

 let controller = NSFetchedResultsController(
 fetchRequest: fetchRequest,
 managedObjectContext: PersistenceController.shared.container.viewContext,
 sectionNameKeyPath: "completionStatus", // e.g., a transient attribute or a computed property
 cacheName: nil
 )
 controller.delegate = self
 try? controller.performFetch()
 return controller
}()

4. FRC ile Tablo View'u Sürücü

Sizin için, yöntemleriniz önemsiz hale gelir:

func numberOfSections(in tableView: UITableView) -> Int {
 fetchedResultsController.sections?.count ?? 0
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
 let sectionInfo = fetchedResultsController.sections![section]
 return sectionInfo.numberOfObjects
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
 let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath)
 let task = fetchedResultsController.object(at: indexPath)
 configure(cell, with: task)
 return cell
}

Biz asla İZFLT:23 olarak aramayız - delege yöntemleri her ekleme, deletion ve güncelleştirmeyi ele alır.

Gelişmiş Kullanım ve En İyi Uygulamaları

Thread Safety

Core Data contexts are not thread-safe. Always use theETHFLT:24) (bu ana kuyrukta çalışır) tüm UI ile ilgili istekler ve FRCs. Arka çalışma için, özel bir kuyruk bağlamı oluşturmak ve aynı FRC'yi birden çok kuyrukta kullanmaktan kaçının.

Caching

[FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=

Büyük Verisetleri işlemek

[[Demek gerekirse, her mülke anında erişim gerekiyorsa, tekrarlanan hataları engelleyebilir.

SwiftUI ile entegrasyon

[FONT: 30) UIKitsantriktir, SwiftUI'de hala onu aritmeyerek SwiftUI'de kullanabilirsiniz, ancak FRC, animasyonlar ve toplulaştırmayı iyi bir şekilde kullanır.

Ortak Pitfalls ve Them'dan Nasıl Kaçırmak

  • [FONT:0)ForgettingurFLT:34:[Dönetici] Kontrol bu yöntemi çağırana kadar getirmeyecektir.Bir kez, genellikle ilkleşmeden sonra.
  • [FONT=0] Bir delege olmadan, değişiklikler masa görünümüne yol açmaz.Her zaman “Ücretsiz” olarak adlandırılır.
  • [FONT:0)Incorrect sort tanımlayıcılar:) Bölümünüz anahtar yolu ilk tür tanımlayıcı ile eşleşmezse, bölümler siparişden çıkabilir.Ver the attributes used in the sort descriptors.
  • [FONT:0) FRC ile birlikte C: çağrılış değişikliklerinin çökebileceği bir değişiklik olmasına neden olabilir.
  • [FONT:0) Temel veri bağlamını görmezden gelmek başarısızlıkları:) Eğer bağlamı ve bir hata meydana getirirseniz, FRC her zaman hataları halledemez ve arka bağlamda kullanımları dikkate alabilir.

Performansı Tahmin Ediyor

[FONT: 40) Zaten verimlidir, ancak burada ek optimizasyonlar vardır:

  • [FONT:0) Akıllı Önlemler Kullanın:[Dönetici:[Dönetici:0) Karmaşık bir predikat ilk getiri yavaşlatabilir. Mümkün olan endeksli özellikleri kullanın.
  • [FONT:0)Limit mülkleri getiriyor:[Döneticilere ihtiyacınız varsa, getirici istek üzerine kuruludur.
  • [FONT=0)Batch Güncellemeleri:[Döneticileri yaparken, onları bir tür delege çağrısının sayısını azaltmak için bir İLFLT:0).
  • [FONT:0) gereksiz bir hatadan yoksun:[Dönetici:[Dönetici:0)[değiştir | kaynağı değiştir] Eğer bir sonuca varacağınızı biliyorsanız, onları önceden ihmal etmek için [[Şerefsiz) kullanın.

Daha derin bir şekilde Core Data performansına atfedin, bakınız:0) Apple'ın Core Data Performance Guide).

Gerçek Dünya Örnekleri

Örnek 1: Chat Application

Bir mesajlaşma uygulaması, en son mesaj tarafından sıralanan bir konuşma listesini gösterir. Yeni gelen mesajlar anında görünmelidir. bir FRC kullanarak, iletişim görüşü yalnızca mevcut kullanıcı konuşma varlıkları için abone olabilir. Bölüming by date groups messages into "Bugün", "Evetterday", vb.

Örnek 2: Inventory Management

Bir e-ticaret uygulaması, kategorilerde ürünler gösterir.Bir arka plan senkronizasyonundan borsalandığında, FRC otomatik olarak UI'yi günceller.T:44'i ayarlayarak, görüş binlerce ürünle bile yanıt verir.

Örnek 3: Kategorilerle Listeyi Yapmalı

Klasik örnek: "Overdue", "Bugün" ve "Güncel" olarak adlandırılan görevler, [[Gize" ve mevcut tarihten hesaplanan geçici bir özellik olabilir.Aynı tanımlayıcı değerin yanlış eşleşmelerden kaçınmak için kullanılır.

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

Core Data veTAY:47'in kombinasyonunun oluşturulması, sağlam, dinamik iOS uygulamaları inşa etmenin bir temelidir.Değişme ve UI senkronizasyonunun Apple'ın çerçevelerine yüklenmesini sağlamak için, kazanım veri yönetimi kodu yazmak yerine büyük bir kullanıcı deneyimi oluşturmaya odaklanabilirsiniz.

Bir miras UIKit uygulamasını sürdürmek veya SwiftUI'yi ESFLT:48 ile benimsemek, ilkeler aynı kalır: nesne grafiğinizi anlamak, yapılandırma isteklerini dikkatle anlamak ve bu makalede belirtilen uygulamalarla ilgili kontrol edin - caching, thread güvenliği ve performans dahil olmak üzere - zaman içinde evrimleşen herhangi bir veri kümesini işlemek için iyi bir şekilde yapılandıracaksınız.

Daha fazla araştırma için, check outurFLT:0)Ray Wenderlich'in Core Data öğreticisi) ve [[Döneticileri Hakkındaki İçerik).