Table of Contents
Johdanto: Miksi ydindata ja NSFetchedTuloksetController asia
Nykyaikaisessa iOS-kehityksessä, joka tuottaa nesteen ja reagoivan käyttöliittymän riippuu usein siitä, kuinka tehokkaasti sovelluksesi käsittelee ajan myötä muuttuvia tietoja. Olitpa rakentamassa sosiaalista syötettä, tehtäväpäällikköä tai varastojärjestelmää, käyttäjille näytetyt tiedot ovat harvoin staattisia. Core Data . Applen kypsä objektikaavio ja pysyvyyskehys [] (FRC) tarjoaa taistelutestatun ratkaisun dynaamisten, suurten tietokokonaisuuksien hallintaan samalla kun se pitää UI:n synkronoituna ilman manuaalista ylävirtaa.
Tässä artikkelissa annetaan perusteellinen käytännön opas Core Datan käyttöön -ilmoituksilla on keskeinen merkitys. Kun esineitä lisätään, päivitetään tai poistetaan, konteksti lähettää nämä muutokset, mikä on juuri se, mitä vipuvaikutus pitää käyttöliittymän johdonmukaisena.
Viralliset kehittäjädokumentit: Applen perustietokehysviite.
NSFetchedResultsController: Bridge välillä ydindatan ja käyttöliittymä
on rekisterinpitäjä objekti, joka on suunniteltu hallitsemaan tehokkaasti Core Data -hakupyynnöstä saatuja tuloksia, erityisesti silloin, kun taustalla olevien tietojen odotetaan muuttuvan. Se seuraa hallittua objektiyhteyttä ja raportoi automaattisesti muutoksista protokollansa kautta.
Tärkeimmät ominaisuudet
- Automaattinen muutosseuranta:[] FRC kuuntelee asiayhteysilmoituksia ja muuntaa ne jäsennellyiksi valtuutettujen puheluiden takaisinsaamisiksi (, ], []]).
- Rakennettu osiointi:[ Määrittelemällä , ohjainryhmät noutavat tuloksia osiin, jolloin on merkityksetöntä näyttää osioidut pöytä- ja keräysnäkymät.
- Täytäntöönpanon optimointi:[] FRC käyttää vianmääritystä ja välimuistia konepellin alla. Se hakee tietoja vain tarpeen mukaan ja voi vapaaehtoisesti käyttää jatkuvaa välimuistia välttääkseen uudelleenhakemisen, kun hallittu objektiyhteys tallennetaan.
Yksityiskohtaiset delegoidut menetelmät
Voit täysin hyötyä rekisterinpitäjä, sinun täytyy toteuttaa . Yleisin kaava on käyttää näitä Callbacks sisällä tai [ delegoida eräpäivityksen käyttöliittymä. Esimerkiksi:
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()
}
Tämä malli takaa, että taulukkonäkymä animoi muutokset synkronoitua taustalla olevan datan, estää välkkymisen tai epäjohdonmukaisuuden.
Vaiheittainen täytäntöönpano
Alla on täydellinen, tuotantovalmis esimerkki Swift 5:stä, iOS 15+:sta. Oletamme yksinkertaisen entiteetin nimeltä , jossa on attribuutit (String) ja (Bool) ja (Päiväys).
1. Aseta ydindata pino
tai (yleinen SwiftUI-sovelluksissa), luo pysyvä säiliö:
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. Luo NSManagedObject alaluokka
Käytä Xcoden datamallieditoria luokkatiedostojen tuottamiseen tai niiden luomiseen manuaalisesti. Varmista, että yksikkösi käyttää oikeaa luokkamoduulin asetusta.
3. Määritä noutopyyntö ja FRC
Näkymäohjain, aseta noutopyyntö ja alusta noutotulosohjain. On parasta suorittaa tämä tai näkymämallin 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. Aja pöytänäkymää FRC:llä
-menetelmäsi muuttuvat mitättömiksi:
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
}
Huomaa, ettemme koskaan soita manuaalisesti ... delegoimalla menetelmät käsittelevät jokaista sisäänpanoa, poistoa ja päivitystä.
Kehittyneet käyttötavat ja parhaat käytännöt
Säikeen turvallisuus
Core Data-ympäristöt eivät ole langaton-turvallisia. Käytä aina (joka kulkee pääjonossa) kaikkiin UI-hakupyyntöihin ja FRC-pyyntöihin. Taustatyötä varten luo oma jonotusympäristö ja yhdistä muutokset näkymään. Vältä saman FRC:n käyttämistä useissa jonoissa.
Välimuisti
-parametri voi parantaa laukaisusuoritusta jatkuvan osion ja objekti-infon avulla. Jos noutopyyntösi tai tietomallisi kuitenkin muuttuu, sinun on poistettava välimuisti () korruption välttämiseksi.
Suurten tietoaineistojen käsittely
Käytä rajoittaaksesi muistiin noudettujen esineiden määrää. Harkitset myös asetusta vain, jos tarvitset välitöntä pääsyä jokaiseen omaisuuteen. Suhdeintensiivisten tietojen osalta esikäsittely voi estää toistuvat virheet.
Integrointi SwiftUI:n kanssa
Vaikka on Uikit-centric, sitä voi silti käyttää SwiftUI:ssa käärimällä sen :een tai käyttämällä uudempaa :n ominaisuuskäärettä (joka sisäisesti käyttää samanlaista mekanismia). Swiftuin monimutkaisiin dynaamisiin tietoihin on yleensä riittävä, mutta FRC antaa sinulle hienoksi manimaatioiden ja eränoton valvonnan.
Yhteinen pitfalls ja miten välttää niitä
- Unohtakaa :[] Ohjaaja ei suorita noutoa ennen kuin tätä menetelmää kutsutaan. Tee se kerran, yleensä heti alustamisen jälkeen.
- Ei aseta valtuutettua:[] Ilman valtuutettua muutokset eivät leviä pöytänäkymään. Soita aina .
- Virheelliset lajittelusanat:[] Jos osion nimi avainpolku ei vastaa ensimmäistä lajia, osiot voivat ilmestyä epäkunnossa. Varmista, että -muodossa käytetty ominaisuus esiintyy lajitelluissa kuvauksissa.
- ]Käyttäminen [] FRC:[] Soita , kun taas FRC animoi muutoksia voi aiheuttaa kaatumisia. Anna delegoitujen menetelmien käsitellä kaikki käyttöliittymäpäivitykset.
- Ydintietojen tallentaminen tallenna virheitä:[] Jos tallennat kontekstin ja virhe tapahtuu, FRC:lle ei ehkä ilmoiteta. Käsittele aina virheitä ja harkitse :n käyttöä taustayhteyksissä.
Suorituskyvyn huomioon ottaminen
on jo tehokas, mutta tässä on lisää optimointia:
- Käytä predikaatteja viisaasti:[] Monimutkainen predikaatti voi hidastaa alkuperäistä noutoa. Käytä indeksoituja ominaisuuksia mahdollisuuksien mukaan.
- Limit noutoominaisuudet:[] Jos tarvitset vain tiettyjä ominaisuuksia, aseta noutopyyntöön .
- ]Perustuspäivitykset:[] Kun teet monia muutoksia, kiedo ne -blokkiin, jotta voidaan vähentää valtuutettujen puhelujen määrää.
- Vältä tarpeetonta vikaa: [ Jos tiedät pääset kaikki objektit tulos asetettu, käytä etukäteen niiden, mutta ole varovainen muistissa.
Syvempää sukellusta ydindatan suorituskykyyn on [ Applen perusdatan suorituskyvyn ohje [.
Esimerkkejä reaalimaailmasta
Esimerkki 1: Chat-sovellus
Viestisovellus näyttää luettelon viimeisimmän viestin mukaan lajitelluista keskusteluista. Uudet saapuvat viestit tulisi näkyä heti. FRC:n avulla yhteystietonäkymä voi tilata muutoksia vain nykyisen käyttäjän keskustelukokonaisuuksille. Jakaminen päivämääräryhmittäin "Tänään," "Eilen" jne.
Esimerkki 2: Inventaarion hallinta
Sähköinen kaupankäynti -sovellus näyttää tuotteita kategorioissa. Kun varastotasot muuttuvat taustasynkronista, FRC päivittää käyttöliittymän automaattisesti. Asettamalla 50:een näkymä pysyy reagoivana jopa tuhansilla erillä.
Esimerkki 3: Tee luettelo kategorioista
Klassinen esimerkki: tehtävät ryhmitelty "Overdue," "Tänään" ja "Upcoming." [ voi olla tilapäinen johdettu ominaisuus, joka on laskettu [] ja nykyinen päivämäärä. Varmista, että samaa johdettua arvoa käytetään eräänlaisessa kuvauksessa, jotta vältetään epäsuhtaisuudet.
Päätelmä
Päämääränä on . Se on vankkaa ja dynaamista iOS-sovellusta rakentavan rakenteen kulmakivi. Lataamalla muutoksen seurannan ja UI-synkronoinnin raskaat nostot Applen kehyksiin voit keskittyä luomaan hyvän käyttäjäkokemuksen sen sijaan, että kirjoittaisit kattilalevyn data-hallintakoodin.
Olitpa ylläpitää perintöä Uikit-sovellus tai hyväksyä SwiftUI kanssa , periaatteet pysyvät samoina: ymmärtää objektikaavio, määrittää noutaa pyyntöjä huolellisesti, ja anna noudetut tulokset ohjain tehdä mitä se tekee parhaiten. Kun käytäntöjä hahmotella tässä artikkelissa . ... ~ kuten välimuisti, lanka turvallisuus ja suorituskyky viritys ... olet hyvin varustettu käsittelemään kaikki tiedot, jotka kehittyvät ajan myötä.
Lisätietoja on saatavilla Ray Wenderlichin ydindata-opetusohjelmasta ja NSHipsterin artikkelista NSFetchedResultsController.