Dimulai dengan Data Inti! Sulit dalam kata-kata sederhana [Bagian 2]

Pada artikel ini, saya ingin mengungkap lebih lanjut kemampuan Core Data. Artikel ini merupakan kelanjutan . Saya benar-benar berharap saya bisa mendapatkan ide bahwa Core Data bukan salah satu dari banyak basis data relasional, tetapi alat yang sangat kuat yang dapat menjadi senjata integral dalam gudang pengembang iOS yang menghargai diri sendiri.

Baiklah, mari kita mulai!

Hari ini kita melihat bekerja dengan dua NSManageObjectContext dan NSFetchedResultsController.

Dua NSManageObjectContext dan mengapa ini diperlukan?


Jika aplikasi Anda secara aktif menggunakan API apa pun yang digunakannya menerima data, dan Anda ingin menyimpan data ini di suatu tempat, maka Core Data adalah pilihan yang sangat baik. Masalah apa yang mungkin Anda miliki dengan ini? Yang pertama dan paling jelas - jumlah data akan sangat besar sehingga ketika Anda mencoba untuk menyimpannya, aplikasi kami akan membeku selama beberapa waktu, yang akan mempengaruhi pengalaman pengguna. GCD biasa tidak dapat ditiadakan di sini, karena secara independen, Core Data Stack kami, yang disebutkan di sini , berfungsi secara sinkron dan untuk akses apa pun ke NSManageObjectContext kami, kami harus menunggu hingga akhir loop.

Tapi di sini konteks pribadi NSManageObjectContext yang bekerja di latar belakang datang untuk menyelamatkan. Untuk menyebutnya, Anda harus terlebih dahulu menghubungi NSPersistentContainer kami.

Inisialisasi akan terlihat seperti ini:

lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "Preset")
    container.loadPersistentStores { (persistent, error) in
        if let error = error {
            fatalError("Error: " + error.localizedDescription)
        }
    }
    container.viewContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
    container.viewContext.shouldDeleteInaccessibleFaults = true
    container.viewContext.automaticallyMergesChangesFromParent = true
    return container
}()

Mergepolicy


Di sini Anda menentukan kebijakan penggabungan NSManageObjectContext kami. Di sini kami secara eksplisit menunjukkan bagaimana Data Inti harus berperilaku jika terjadi konflik data.

Opsi MergePolicy:

  1. NSRollbackMergePolicy - Jika terjadi konflik, buang semua perubahan hingga terjadi
  2. NSOverwriteMergePolicy - Menyimpan nilai baru terlepas dari data
  3. NSMergeByPropertyStoreTrumpMergePolicy - Menyimpan properti objek yang diubah oleh properti, dalam hal ini, data yang disimpan akan menang
  4. NSMergeByPropertyObjectTrumpMergePolicy - Menyimpan properti objek yang diubah oleh properti, dalam hal ini data baru akan menang

AutomaticallyMergesChangesFromParent - mengatakan apakah konteks kita akan secara otomatis menggabungkan data.
Lalu buat konteks baru:

let context = persistentContainer.viewContext
let context = persistentContainer.newBackgroundContext()

Sekarang kami memiliki dua NSManageObjectContext. Yang pertama adalah untuk bekerja dengan UI dan berjalan di utas utama, dan yang kedua memiliki privateQueueConcurrencyType untuk bekerja di latar belakang.

Kami akan menggunakannya untuk mengunduh data.

let object = NSEntityDescription.insertNewObject(forEntityName: "Name", into: context)
saveChanges(with: context)

Di sini kita membuat Entity kita dan kemudian kita dapat menetapkan properti yang diperlukan untuk itu, setelah itu kita memanggil metode save, tampilannya seperti ini:

func saveChanges(with context: NSManagedObjectContext) {
        context.performAndWait {
            if context.hasChanges {
                do {
                    try context.save()
                } catch {
                    context.rollback()
                }
            }
            context.reset()
        }
    }

Ada 2 metode untuk dipilih:

  • performAndWait - melakukan tindakan pada utas konteks secara serempak
  • melakukan - melakukan tindakan pada aliran konteks secara tidak sinkron


NSFetchedResultsController


NSFetchedResultsController - pengontrol yang melakukan permintaan tertentu dan menampilkan data yang diperlukan untuk pengguna.

lazy var fetchedResultsController: NSFetchedResultsController<Pack> = {
        let fetchRequest = NSFetchRequest<Pack>(entityName:"Pack")
        fetchRequest.fetchBatchSize = 20
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending:true)]
        let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)

        controller.delegate = self
        do {
            try controller.performFetch()
        } catch {
            print(error.localizedDescription)
        }
        return controller
    }()

NSFetchedResultsController memiliki sejumlah besar konfigurasi, kami akan menganalisis beberapa di antaranya:

Fetchlimit
FetchLimit β€”

Sketchoffset
FetchOffset β€” . 2, .

FetchbatchSize
FetchBatchSize β€” . Table/CollectionView 5 , 7 , .

FetchbatchSize
FetchBatchSize β€” .

SortDescriptor
SortDescriptor β€” , .

ReturnsObjectsAsFaults
ReturnsObjectsAsFaults β€” , , , PersistentStore RawCache

Saat ini, kami memiliki NSFetchedResultsController yang akan menampilkan data kami dalam sebuah tabel. Untuk memperbarui data, Anda perlu memanggil metode delegasi:

extension ViewController: NSFetchedResultsControllerDelegate {
    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
       collectionView.reloadData()
    }
}

Metode delegasi ini berfungsi ketika kami memiliki perubahan dalam konteks kami. Dalam implementasi ini, ini terjadi setelah kami menyimpan data dalam konteks pribadi. Pada saat ini, metode delegasi dipicu dan data diperbarui.

Hanya beberapa tindakan dan Data Inti dari basis data biasa berubah menjadi senjata ampuh bagi pengembang iOS mana pun.

Selamat coding!

All Articles