Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Core Data
Code

Core Data dan Swift: NSFetchedResultsController

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Core Data and Swift.
Core Data and Swift: Relationships and More Fetching
Core Data and Swift: More NSFetchedResultsController

Malay (Melayu) translation by Neurion (you can also view the original English article)

Dalam ansuran sebelumnya dalam siri ini, kami merangkumi asas-asas kerangka data Teras. Sudah tiba masanya kita meletakkan pengetahuan kita untuk digunakan dengan membina aplikasi mudah yang dikuasai oleh Core Data.

Dalam tutorial ini, kami juga akan bertemu dengan pemain bintang lain dalam rangka Data Teras, kelas NSFetchedResultsController. Permohonan yang akan kami buat menguruskan senarai item tugasan. Dengan aplikasi ini, kami boleh menambah, mengemas kini, dan memadamkan item tugasan. Anda akan dengan cepat mengetahui bahawa kelas NSFetchedResultsController menjadikan perkara ini sangat mudah dilakukan.

Prasyarat

Apa yang saya saksikan dalam siri ini pada Data Teras boleh diguna pakai untuk iOS 7+ dan OS X 10.10+, tetapi fokusnya adalah pada iOS. Dalam siri ini, saya akan bekerjasama dengan Xcode 7.1 dan Swift 2.1. Jika anda lebih suka Objektif-C, maka saya cadangkan membaca siri awal saya mengenai rangka Data Teras.

1. Persediaan Projek

Terbuka Xcode, pilih New > Project ... dari menu File, dan pilih templat Single View Application dari iOS > Application kategori.

Choosing the Single View Application Template

Namakan projek Done, tetapkan Language ke Swift, dan tetapkan Devices ke iPhone. Kerana saya ingin menunjukkan kepada anda cara membuat aplikasi Data Teras dari awal, pastikan kotak centang berlabel Use Core Data tidak dicentang. Beritahu Xcode di mana anda ingin menyelamatkan projek dan tekan Create untuk membuat projek.

Configuring the Project

2. Penyediaan Core Data

Buka AppDelegate.swift dan mengisytiharkan tiga sifat yang disimpan malas managedObjectModel jenis NSManagedObjectModel, managedObjectContext jenis NSManagedObjectContext, danStoreCoordinator jenis NSPersistentStoreCoordinator yang berterusan. Sekiranya anda keliru dengan langkah ini, maka saya cadangkan anda melawat semula artikel pertama siri ini, yang meliputi ringkasan Data Teras secara terperinci.

Perhatikan bahawa saya juga telah menambahkan pernyataan import untuk rangka Core Data di bahagian atas AppDelegate.swift.

Ingat bahawa kami menggunakan kata kunci lazy untuk malas menyusun stack Core Data. Ini bermakna bahawa kami instantiate konteks diuruskan objek, model objek yang terurus dan Penyelaras stor berterusan sebaik sahaja mereka diperlukan oleh permohonan. Ekoran pelaksanaan harus faham dan tahu.

Terdapat tiga perkara yang anda harus sedar. Pertama, data model, yang kita akan mewujudkan seterusnya, akan dinamakan Done.momd. Kedua, kita akan nama pada setoran Done yang dilakukan dan ia akan menjadi satu pangkalan data SQLite. Ketiga, jika pada storan simpanan tidak serasi dengan data model, kita panggil abort, membunuh permohonan Seperti yang saya sebutkan lebih awal dalam siri ini, walaupun ini adalah baik dalam pembangunan, anda tidak perlu memanggil abort dalam pengeluaran. Kita akan mengimbas kembali pemindahan dan isu-isu ketidakserasian kemudian dalam siri ini.

Manakala permohonan kami tidak akan rosak jika anda cuba untuk menjalankannya, tindanan teras Data tidak sewajarnya ditubuhkan. Alasan mudah, kita belum dicipta data model lagi. Mari kita menjaga yang dalam langkah seterusnya.

3. Mewujudkan Data Model

Pilih New > fail... dari menu fail dan pilih Data Model dari iOS > kategori teras Data.

Creating the Data Model

Nama fail yang dilakukan, cek semula bahawa ia ditambah ke sasaran dilakukan, dan beritahu Xcode di mana ia perlu disimpan.

Naming the Data Model

Model data yang akan menjadi sangat mudah. Mewujudkan satu entiti baru dan nama Item. Menambah tiga atribut kepada entiti, nama jenis tali, createdAt jenis tarikh, dan jenis Boolean.

Creating the Item Entity

Menandakan sifat-sifat yang diperlukan, bukan pilihan, dan set nilai lalai atribut yang dilakukan kepada NO.

Configuring the Done Attribute

Koleksi Teras Data ditubuhkan dan model data yang dikonfigurasi dengan betul. Inilah masanya untuk membiasakan diri dengan kelas baru rangka kerja teras Data, golongan NSFetchedResultsController.

4. menguruskan Data

Artikel ini bukan hanya kira-kira golongan NSFetchedResultsController, ia adalah mengenai apa yang golongan NSFetchedResultsController tidak di sebalik tabir. Biarlah saya menjelaskan apa yang saya maksudkan dengan ini.

Kalau kita membina aplikasi kami tanpa kelas NSFetchedResultsController, kami perlu mencari jalan untuk memastikan antara-muka pengguna dalam aplikasi yang disegerakkan dengan data yang diuruskan oleh teras Data. Mujurlah, teras Data mempunyai satu penyelesaian yang elegan untuk masalah ini.

Apabila rekod yang dimasukkan, dikemaskini, atau dihapuskan dalam konteks diuruskan objek, konteks objek diuruskan posts pemberitahuan melalui Pusat pemberitahuan. Konteks diuruskan objek yang jawatan tiga jenis pemberitahuan:

  • NSManagedObjectContextObjectsDidChangeNotification: Pemberitahuan ini dimasukkan setiap kali rekod dalam konteks objek yang diuruskan adalah dimasukkan, dikemaskini, atau dihapuskan.
  • NSManagedObjectContextWillSaveNotification: Pemberitahuan ini dikirim oleh konteks objek diuruskan sebelum menunggu perubahan komited pada storan simpanan.
  • NSManagedObjectContextDidSaveNotification: Pemberitahuan ini dikirim oleh konteks objek diuruskan dengan serta-merta selepas menunggu perubahan telah dilakukan pada storan simpanan.

Kandungan notis ini adalah sama, iaitu hak milik objek pemberitahuan itu adalah contoh NSManagedObjectContext yang dikirim pemberitahuan dan kamus userInfo pemberitahuan yang mengandungi rekod-rekod yang telah dimasukkan, dikemaskini , dan dihapuskan.

Intipati adalah bahawa ia memerlukan sejumlah saksama kod boilerplate untuk menjaga hasil permintaan mencecah up to date. Dalam erti kata lain, jika kita membuat permohonan kami tanpa menggunakan kelas NSFetchedResultsController, kami perlu melaksanakan satu mekanisme yang dipantau konteks objek diuruskan untuk perubahan dan mengemaskini user interface dengan sewajarnya. Mari kita lihat bagaimana NSFetchedResultsController yang boleh membantu kita dengan tugas ini.

5. menyediakan antara muka pengguna

Bekerja dengan NSFetchedResultsController dalam kelas adalah cukup mudah. Sebuah instance dari golongan NSFetchedResultsController mengambil ajak mencecah dan mempunyai sebuah objek perwakilan. Objek yang NSFetchedResultsController memastikan bahawa ia memastikan keputusan permohonan mencecah sehingga tarikh dengan memantau konteks objek yang diuruskan atas permintaan mencecah telah disempurnakan.

Jika objek yang NSFetchedResultsController diberi notis pemberitahuan mengenai perubahan oleh objek NSManagedObjectContext permintaan mencecah, ia mengumumkan para perwakilan. Anda mungkin tertanya-tanya apakah ini berbeza dari pengawal paparan secara langsung pemantauan objek NSManagedObjectContext. Keindahan dalam kelas NSFetchedResultsController adalah bahawa ia memproses pemberitahuan ia menerima dari objek NSManagedObjectContext dan memberitahu perwakilan sahaja apa perlu tahu untuk mengemaskini user interface sebagai tindak balas kepada perubahan ini. Kaedah protokol NSFetchedResultsControllerDelegate perlu menjelaskan ini.

Tandatangan daripada kaedah perwakilan di atas mendedahkan tujuan sebenar golongan NSFetchedResultsController. Di iOS, kelas NSFetchedResultsController direka untuk mengurus data yang dipaparkan oleh UITableView atau UICollectionView. Ia memberitahu perwakilannya dengan tepat rekod mana yang berubah, bagaimana untuk mengemas kini antara muka pengguna, dan bila untuk melakukan ini.

Jangan risau jika anda masih tidak pasti mengenai maksud atau kelebihan golongan NSFetchedResultsController.  Ia akan menjadikan lebih faham apabila kami telah melaksanakan protokol NSFetchedResultsControllerDelegate. Mari kita mengimbas kembali permohonan kami dan dimasukkan ke kelas NSFetchedResultsController untuk digunakan. 

Langkah 1: Mengisi Storyboard

Buka storyboard utama proyek, Main.storyboard, pilih View Controller Scene, dan tanamkan dalam controller navigasi dengan memilih Embed In> Navigation Controller dari menu Editor.

Seret objek UITableView di View Controller Scene, buat outlet di kelas ViewController, dan hubungkan di storyboard. Jangan lupa untuk membuat kelas ViewController sesuai dengan protokol UITableViewDataSource dan UITableViewDelegate.

Pilih paparan jadual, buka Connections Inspector, dan sambungkan data paparan dataSource dan delegate cawangan ke objek View Controller. Dengan paparan jadual dipilih, buka Attributes Inspector dan tetapkan bilangan Prototype Cells kepada 1.

Sebelum kita meneruskan, kita perlu membuat subclass UITableViewCell untuk sel prototaip. Buat subclass Objektif-C baru, ToDoCell, dan tetapkan superclassnya kepada UITableViewCell. Buat dua cawangan, namaLabel jenis UILabel dan doneButton jenis UIButton.

Kembali ke papan cerita, pilih sel prototipe dalam tampilan jadual, dan atur kelas ke ToDoCell dalam Identity Inspector. Tambah UILabel dan objek UIButton ke paparan kandungan sel dan sambungkan kedai di Connections Inspector. Dengan sel prototaip yang dipilih, buka Attributes Inspector dan tetapkan pengenal sel prototaip ke ToDoCell. Pengenal ini akan berfungsi sebagai pengecam semula sel semula. Tata letak prototaip sel sepatutnya kelihatan seperti tangkapan skrin di bawah.

Creating the ToDoCell Prototype Cell

Buat subclass ViewController baru dan namakan AddToDoViewController. Buka AddToDoViewController.swift, mengisytiharkan textField jenis UITextField dan mematuhi pengawal paparan ke protokol UITextFieldDelegate.

Sebelum kita menambah pengawal paparan ke papan cerita, tambahkan dua tindakan berikut ke fail pelaksanaan pengawal pandangan.

Buka papan cerita sekali lagi dan tambahkan butang butang bar dengan pengecam Add ke kanan bar navigasi ViewController. Tambah pengawal paparan baru ke papan cerita dan tetapkan kelasnya kepada AddToDoViewController dalam Identity Inspector. Dengan pengawal paparan yang dipilih, pilih Embed In > Navigation Controller dari menu Editor.

Pengawal paparan baru kini perlu mempunyai bar navigasi. Tambah dua butang butang bar ke bar navigasi, satu di sebelah kiri dengan identiti Cancel dan satu di sebelah kanan dengan identiti Save. Sambungkan tindakan cancel(_:) ke butang butang bar kiri dan tindakan save(_:) ke butang butang bar kanan.

Tambah objek UITextField ke pandangan pengawal pandangan dan letakkannya 20 mata di bawah bar navigasi. Medan teks harus kekal di 20 poin di bawah bar navigasi. Ambil perhatian bahawa kekangan susun atur di atas merujuk top layout guide.

Adding Layout Constraints

Sambungkan medan teks dengan alur yang sama di pengawal paparan dan tetapkan pengawal paparan sebagai perwakilan medan teks. Akhir sekali, kawalan seret dari butang butang bar ViewController ke pengawal navigasi yang AddToDoViewController adalah pengawal pandangan root. Tetapkan jenis segue untuk Present Modally dan tetapkan pengecam segue kepada SegueAddToDoViewController dalam Attributes Inspector. Itu banyak yang perlu diambil. Bahagian yang menarik masih belum datang.

Attributes Inspector

Sebelum kita boleh mengambil permohonan untuk putaran, kita perlu melaksanakan protokol UITableViewDataSource dalam kelas ViewController. Bagaimanapun, ini adalah tempat kelas NSFetchedResultsController dimainkan. Untuk memastikan bahawa semuanya berfungsi kembali 0 dari kaedah tableView(_:numberOfRowsInSection:). Ini akan menghasilkan paparan jadual kosong, tetapi ia akan membolehkan kami menjalankan aplikasi tanpa berlanggar.

Untuk memenuhi compiler, kita juga perlu melaksanakan tableView(_:cellForRowAtIndexPath:). Di bahagian atas AddToDoViewController.swift, tambahkan pemalar untuk pengecam semula sel semula.

Melaksanakan tableView(_:cellForRowAtIndexPath:) agak mudah kerana kami tidak melakukan apa-apa yang istimewa dengan sel paparan meja lagi.

Langkah 3: Simpan dan Batal

Buka kelas AddToDoViewController dan melaksanakan cancel(_:) dan save(_:) kaedah seperti yang ditunjukkan di bawah. Kami akan mengemas kini pelaksanaannya kemudian dalam tutorial ini.

Bina dan jalankan aplikasi dalam simulator untuk melihat sama ada semuanya disambungkan dengan betul. Anda harus dapat mengetuk butang tambah di bahagian atas kanan untuk memunculkan AddToDoViewController dan memecatnya dengan mengetik sama ada butang batal atau simpan.

6. Menambah Kelas NSFetchedResultsController

Kelas NSFetchedResultsController adalah sebahagian daripada rangka kerja Data Teras dan ini bertujuan untuk menguruskan hasil permintaan piksel. Kelas ini direka untuk berfungsi dengan lancar dengan UITableView dan UICollectionView pada iOS dan NSTableView pada OS X. Walau bagaimanapun, ia boleh digunakan untuk tujuan lain juga.

Langkah 1: Meletakkan Groundwork

Sebelum kita boleh mula bekerja dengan kelas NSFetchedResultsController, bagaimanapun, kelas ViewController memerlukan akses kepada contoh NSManagedObjectContext, contoh NSManagedObjectContext yang kami buat sebelumnya dalam perwakilan aplikasi. Mulakan dengan mengisytiharkan harta yang managedObjectContext jenis NSManagedObjectContext! dalam fail pengepala kelas ViewController. Perhatikan bahawa kami juga menambah pernyataan import untuk rangka Data Teras di bahagian atas.

Buka Main.storyboard, pilih pengawal paparan awal papan cerita, contoh UINavigationController, dan tetapkan Storyboard ID kepada StoryboardIDRootNavigationController dalam Identity Inspector.

Dalam aplikasi perwakilan application(_:didFinishLaunchingWithOptions:), kami mendapatkan rujukan kepada contoh ViewController, pengawal pandangan root pengawal navigasi, dan menetapkan sifat managedObjectContextnya. Aplikasi terkini (_:didFinishLaunchingWithOptions:) kelihatan seperti berikut:

Untuk memastikan semuanya berfungsi, tambahkan penyataan cetakan berikut ke kaedah viewDidLoad() dalam kelas ViewController.

Langkah 2: Mulakan kemasukan NSFetchedResultsController Contance

Buka fail pelaksanaan kelas ViewController dan mengisytiharkan harta disimpan malas jenis NSFetchedResultsController. Namakan property fetchResultsController. Contoh NSFetchedResultsController juga mempunyai harta perwakilan yang perlu mematuhi protokol NSFetchedResultsControllerDelegate. Kerana contoh ViewController akan berfungsi sebagai perwakilan dari contoh NSFetchedResultsController, kita perlu mematuhi kelas ViewController ke protokol NSFetchedResultsControllerDelegate seperti ditunjukkan di bawah.

Sudah tiba masanya untuk memulakan contoh NSFetchedResultsController. Jantung dari pengawal hasil dijemput adalah objek NSFetchRequest, kerana ia menentukan yang merekodkan pengawal hasil yang dijana akan dikendalikan. Dalam paparan viewDidLoad() kaedah pengawal, kami memulakan permintaan piksel dengan lulus "Item" ke kaedah initWithEntityName(_:). Ini sepatutnya menjadi biasa sekarang dan seterusnya adalah baris seterusnya di mana kita menambah deskriptor jenis untuk permintaan piksel untuk mengisih hasil berdasarkan nilai atribut yang createdAt setiap rekod.

Inisialisasi pengawal keputusan yang diambil adalah agak mudah. The init (fetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:) mengambil empat argumen:

  • permintaan persiapan
  • konteks objek yang diuruskan pengawal hasil dijemput akan memantau
  • laluan utama seksyen sekiranya anda mahu keputusan dipecah menjadi bahagian
  • nama cache jika anda mahu mengaktifkan caching

Kami lulus nil untuk dua parameter terakhir untuk sekarang. Argumen pertama adalah jelas, tetapi mengapa kita perlu lulus objek NSManagedObjectContext juga? Bukan sahaja lulus dalam konteks objek yang diuruskan yang digunakan untuk melaksanakan permintaan pikutan, ia juga merupakan konteks objek yang diuruskan bahawa pengawal hasil dijangkiti akan memantau perubahan. Ini akan menjadi lebih jelas dalam beberapa minit apabila kita mula melaksanakan kaedah perwakilan protokol NSFetchedResultsControllerDelegate.

Akhir sekali, kita perlu memberitahu pengawal keputusan yang diambil untuk melaksanakan permintaan yang kami lulus. Kami melakukan ini dengan menggunakan performFetch() dalam viewDidLoad(). Perhatikan bahawa ini adalah kaedah lemparan, yang bermaksud kita perlu membungkusnya dalam pernyataan do-catch. Kaedah performFetch() adalah serupa dengan kaedah executeFetchRequest(_:) daripada kelas NSManagedObjectContext.

Langkah 3: Melaksanakan Protokol Delegasi

Dengan pengawal hasil yang dijana siap dan sedia untuk digunakan, kita perlu melaksanakan protokol NSFetchedResultsControllerDelegate. Seperti yang kita lihat sebelumnya, protokol itu mentakrifkan lima kaedah, tiga daripadanya adalah kepentingan kami dalam tutorial ini:

  • controllerWillChangeContent(controller: NSFetchedResultsController)
  • controllerDidChangeContent(controller: NSFetchedResultsController)
  • controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?)

Dua kaedah pertama memberitahu kami apabila data pengawal keputusan yang diambil adalah menguruskan akan dan melakukan perubahan. Ini penting untuk mengemas kini antara muka pengguna. Sebagai contoh, ada kemungkinan perubahan berganda pada masa yang sama. Daripada mengemas kini antara muka pengguna untuk setiap perubahan, kami mengemas kini antara muka pengguna sebaik sahaja semua perubahan telah dibuat.

Dalam contoh kami, ini beralih ke pelaksanaan berikut controllerWillChangeContent(controller: NSFetchedResultsController) dan controllerDidChangeContent (controller: NSFetchedResultsController).

Pelaksanaan controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath ?, untukChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) Adalah sedikit lebih rumit. Kaedah perwakilan ini tidak kurang dari lima argumen:

  • contoh NSFetchedResultsController
  • contoh NSManagedObject yang berubah
  • Indeks current semasa rekod dalam pengawal keputusan yang diambil
  • jenis perubahan, iaitu insertupdate, or delete
  • laluan indeks baru rekod dalam pengawal keputusan yang diambil, after perubahan

Perhatikan bahawa laluan indeks tiada kaitan dengan pandangan jadual kami. NSIndexPath tidak lebih dari satu objek yang mengandungi satu atau lebih indeks untuk mewakili jalan dalam struktur hierarkis, maka nama kelasnya.

Di dalam secara dalaman, pengawal keputusan dijemput menguruskan struktur data hierarki dan memaklumkan perwakilannya apabila struktur data berubah. Terpulang kepada kita untuk memvisualisasikan perubahan tersebut, sebagai contoh, paparan jadual.

Pelaksanaan controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath ?, untukChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) Kelihatan menakutkan, tetapi saya akan berjalan anda melalui itu.

Jenis perubahan adalah jenis NSFetchedResultsChangeType. Penghitungan ini mempunyai empat nilai ahli:

  • Insert
  • Delete
  • Move
  • Update

Nama-nama itu cukup jelas. Jika jenis tersebut di Insert, kami memberitahu paparan jadual untuk memasukkan baris di newIndexPath. Begitu juga, jika jenis itu Delete, kami keluarkan baris di indexPath dari paparan jadual.

Jika rekod dikemas kini, kami mengemas kini baris yang sepadan dalam paparan jadual dengan menggunakan configureCell(_:atIndexPath:), kaedah penolong yang menerima objek ToDoCell dan objek NSIndexPath. Kami akan melaksanakan kaedah ini dalam seketika.

Jika jenis perubahan sama dengan Move, kami keluarkan baris di indexPath dan masukkan baris di newIndexPath untuk mencerminkan kedudukan dikemaskini rekod dalam struktur data dalaman pengawal hasil yang dirangka.

Langkah 4: Melaksanakan Protokol UITableViewDataSource

Itu tidak terlalu sukar. Adakah ia? Melaksanakan protokol UITableViewDataSource lebih mudah, tetapi ada beberapa perkara yang perlu anda ketahui. Mari kita mulakan dengan numbersOfSectionsInTableView (_ :) dan tableView(_:numberOfRowsInSection:.

Walaupun paparan jadual dalam aplikasi contoh kami hanya akan mempunyai satu bahagian, mari tanya pengawal keputusan yang diambil untuk bilangan bahagian. Kami melakukan ini dengan memanggil sections di atasnya, yang mengembalikan pelbagai objek yang mematuhi protokol NSFetchedResultsSectionInfo.

Objek yang mematuhi protokol NSFetchedResultsSectionInfo perlu melaksanakan beberapa kaedah dan sifat, termasuk numberOfObjects. Ini memberi kita apa yang kita perlukan untuk melaksanakan dua kaedah pertama protokol UITableViewDataSource.

Seterusnya ialah tableView(_:cellForRowAtIndexPath:) dan configureCell (_:atIndexPath:). Pelaksanaan tableView(_:cellForRowAtIndexPath:) adalah pendek, kerana kita memindahkan sebahagian besar konfigurasi sel untuk configureCell(_:atIndexPath:). Kami meminta paparan jadual untuk sel boleh digunakan semula dengan pengimeikan semula ReuseIdentifierToDoCell dan lulus sel dan laluan indeks untuk configureCell(_:atIndexPath:).

Keajaiban berlaku dalam configureiCell(_:atIndexPath:). Kami meminta pengawal keputusan yang diambil untuk item di indexPath. Pengawal keputusan yang dijemput mengembalikan contoh NSManagedObject kepada kami. Kami mengemas kini nameLabel dan keadaan doneButton yang telah dilakukan dengan meminta rekod untuk name dan done yang dilakukan.

Kami akan mengkaji semula protokol UITableViewDataSource kemudian dalam tutorial ini apabila kami memadam item dari senarai. Pertama, kita perlu mengisi pandangan jadual dengan beberapa data.

7. Menambah Rekod

Mari selesai tutorial ini dengan menambahkan keupayaan untuk membuat item tugasan. Buka kelas AddToDoViewController, tambah pernyataan import untuk kerangka data Teras, dan mengisytiharkan harta yang managedObjectContext jenis NSManagedObjectContext!.

Kepala kembali ke kelas ViewController dan laksanakan kaedah prepareForSegue(_:sender:). Dalam kaedah ini, kami menetapkan property managedBlackContext dari contoh AddToDoViewController. Jika anda telah bekerja dengan papan cerita sebelum ini, maka pelaksanaan prepareSegue(_:sender:) haruslah mudah.

Jika pengguna memasuki teks dalam medan teks AddToDoViewController dan mengetuk butang Save, kami membuat rekod baru, mengisi data dengan data, dan simpannya. Logik ini masuk ke kaedah save(_:) yang kami buat sebelum ini.

Kaedah save(_:) kelihatan sangat mengagumkan, tetapi tiada apa-apa di dalamnya yang belum kita pelajari. Kami membuat objek terurus baru, menggunakan contoh NSEntityDescription dan contoh NSManagedObjectContext. Kami kemudian mengisi objek yang diurus dengan nama dan tarikh.

Sekiranya menyelamatkan konteks objek yang diurus berjaya, kami menolak pengawal paparan, jika tidak, kami menunjukkan amaran dengan menggunakan showAlertWithTitle(_:message:cancelButtonTitle:), kaedah penolong. Jika pengguna mengetik butang simpan tanpa memasukkan sebarang teks, kami juga memaparkan amaran. Dalam showAlertWithTitle(_:message:cancelButtonTitle:), kami membuat, mengkonfigurasi, dan membentangkan UIAlertController.

Jalankan aplikasi dan tambah beberapa item. Saya pasti anda bersetuju bahawa kelas NSFetchedResultsController membuat proses menambah item sangat mudah. Ia menjaga pemantauan konteks objek yang diuruskan untuk perubahan dan kami mengemas kini antara muka pengguna, pandangan jadual kelas ViewController, berdasarkan contoh NSFetchedResultsController yang memberitahu kami melalui protokol NSFetchedResultsControllerDelegate.

Kesimpulan

Dalam artikel seterusnya, kami akan menyelesaikan aplikasi dengan menambah keupayaan untuk memadam dan mengemas kini item tugasan. Penting untuk memahami konsep yang dibincangkan dalam artikel ini. Cara Data Teras menyiarkan perubahan keadaan konteks objek yang diurus adalah penting, jadi pastikan anda memahami perkara ini sebelum bergerak.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.