Core Data- og Swift: Batch oppdateringer
15
Del
3
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie kalt kjernedata og Swift.Core Data- og Swift. Samtidighet
Selv om Core-Data har eksistert i mange år på OS X og iOS, en funksjon som ble innført først nylig er batch oppdateringer. Utviklere har spurt etter denne funksjonen i mange år og Apple endelig funnet en måte å integrere den i kjernedata. I denne opplæringen vil jeg vise deg hvordan batch oppdateringer fungerer og hva de betyr for Core data rammeverket.
1. Problemet
Kjerne data er gode på å håndtere objekt grafer. Selv komplekse objekt grafer med mange enheter og relasjoner er ikke mye av et problem for kjernedata. Men gjør kjernedata har noen svake punkter, oppdatering stort antall poster være en av dem.
Problemet er lett å forstå. Når du oppdaterer en post, laster kjernedata posten inn i minnet, oppdaterer posten, og lagrer endringene i den vedvarende butikken, en SQLite database for eksempel.
Hvis kjernedata må oppdatere et stort antall poster , det er behov for å laste hver post i minnet, oppdatere posten, og sende endringene til den vedvarende butikken. Hvis antall poster er for stor, vil iOS bare kausjon ut på grunn av manglende ressurser. Selv om en enhet som kjører OS X kan ha ressurser til å gjennomføre anmodningen, vil det være treg og bruker mye minne.
En alternativ tilnærming er å oppdatere postene i grupper, men som også tar mye av tid og ressurser. På iOS 7, det er det eneste alternativet iOS utviklere har. Det er ikke lenger tilfelle siden iOS 8 og OS X Yosemite.
2. Løsningen
På iOS 8 og opp og OS X Yosemite og opp, er det mulig å snakke direkte til den vedvarende butikken og fortelle den hva du ønsker å endre. Dette innebærer vanligvis å oppdatere et attributt. Apple kaller denne funksjonen batch oppdateringer.
Det finnes en rekke fallgruver å se opp for skjønt. Kjernen data gjør en masse ting for deg og du kan ikke engang klar over det før du bruker batch oppdateringer. Validering er et godt eksempel. Fordi kjernedata utfører batch oppdateringer direkte på vedvarende butikken, for eksempel en SQLite database, er kjernedata ikke er i stand til å utføre noen undersøkelser på data du skriver til den vedvarende butikken. Dette betyr at du er ansvarlig for å sørge for at du ikke legger til ugyldige data til den vedvarende butikken.
Når vil du bruke batch oppdateringer? Apple anbefaler å bare bruke denne funksjonen hvis den tradisjonelle tilnærmingen er for ressurs eller tidkrevende. Hvis du trenger å markere hundrevis eller tusenvis av e-postmeldinger som lest, så batch oppdateringer er den beste løsningen på iOS 8 og opp og OS X Yosemite og opp.
3. Hvordan virker det?
For å illustrere hvordan batch oppdateringer fungerer, foreslår jeg at vi besøker Ferdig, en enkel kjernedata program som styrer en to-do liste. Vi vil legge til en knapp navigasjonsfeltet som markerer hvert element i listen som gjøres
Trinn 1:. Projet Setup
Last ned eller klone prosjektet fra GitHub og åpne den i Xcode 7 . Kjør programmet i simulatoren og tilsett noen gjøremål
Trinn 2:. Lag Bar Button Varen
Åpne ViewController.swift Hotell og erklære en eiendom, . checkAllButton, av type UIBarButtonItem øverst
importere UIKitimport CoreDataclass ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate {la ReuseIdentifierToDoCell = "ToDoCell"IBOutlet svak Var Tableview: UITableView! Var managedObjectContext: NSManagedObjectContext! Var checkAllButton: UIBarButtonItem! ...}
Initial baren knappen elementet i viewDidLoad () metoden i ViewController klassen og sette den som venstre bar knappen element av navigasjons varen
//initial Sjekk All ButtoncheckAllButton = UIBarButtonItem (tittel.: "Check All", stil: .Plain, target: selvtillit, handling: "checkAll:") //Konfigurer Navigation ItemnavigationItem.leftBarButtonItem = checkAllButton
Trinn 3: Implementere checkAll (_ :) Metode
checkAll (_ :) metoden er ganske lett, men det er et par ting å se opp for. Ta en titt på gjennomføringen nedenfor
func checkAll (avsender: UIBarButtonItem). {//Lag Entity Beskrivelse la entityDescription = NSEntityDescription.entityForName ("Item", inManagedObjectContext: managedObjectContext) //Initial Batch Update Request la batchUpdateRequest = NSBatchUpdateRequest ( enhet: entityDescription) //Konfigurer Batch Update Request batchUpdateRequest.resultType = .UpdatedObjectIDsResultType batchUpdateRequest.propertiesToUpdate = ["ferdig": NSNumber (bool: true)] gjøre {//Execute Batch Request la batchUpdateResult = prøve managedObjectContext.executeRequest (batchUpdateRequest) som! NSBatchUpdateResult //Extract Object IDer la objectIDs = batchUpdateResult.result som! [NSManagedObjectID] for objectID i objectIDs {//Ta Managed Objects inn feil la managedObject = managedObjectContext.objectWithID (objectID) managedObjectContext.refreshObject (managedObject, mergeChanges: falske)} //Utfør Fetch prøve self.fetchedResultsController.performFetch ()} catch { la updateError = feil som NSError print ("\\ (updateError), \\ (updateError.userInfo)")}}
Opprett Batch Request
Vi starter ved å opprette en NSEntityDescription eksempel for Element
enhet og bruke den til å initialisere en NSBatchUpdateRequest objekt. Den NSBatchUpdateRequest klasse er en underklasse av NSPersistentStoreRequest
//Opprett Entity Descriptionlet entityDescription = NSEntityDescription.entityForName ("Item", inManagedObjectContext: managedObjectContext). //Initial Batch Update Requestlet batchUpdateRequest = NSBatchUpdateRequest (enhet: entityDescription)
satt resultatet type batch oppdateringen forespørsel til .UpdatedObjectIDsResultType, medlem verdien av NSBatchUpdateRequestResultType enum. Dette betyr at resultatet av batch oppdatere forespørsel vil være en matrise som inneholder objekt IDer, forekomster av NSManagedObjectID klassen, av postene som ble endret ved batch oppdateringen forespørsel.
//Konfigurer Batch Update RequestbatchUpdateRequest.resultType =. UpdatedObjectIDsResultType
Vi fyller også propertiesToUpdate eiendommen av batch oppdateringen forespørsel. For dette eksempelet setter vi propertiesToUpdate til en ordbok som inneholder en nøkkel, "ferdig", med verdi NSNumber (bool: true). Dette betyr at hver Vare
posten vil bli satt til gjort
, som er det vi er ute etter
//Konfigurer Batch Update RequestbatchUpdateRequest.propertiesToUpdate = ["ferdig". NSNumber (bool: true)] Kjør Batch Update Request
Selv om batch oppdateringer omgå klarte objektet sammenheng, gjennomføre en batch oppdatering anmodning gjøres ved å ringe executeRequest (_ :) på en NSManagedObjectContext eksempel. Denne metoden tar ett argument, en forekomst av NSPersistentStoreRequest klassen. Fordi executeRequest (_ :) er en kaste metoden, kjører vi metoden i en gjør-fangst uttalelse.
Gjøre {//Execute Batch Request la batchUpdateResult = prøve managedObjectContext.executeRequest (batchUpdateRequest) som! NSBatchUpdateResult} catch {la updateError = feil som NSError print ("\\ (updateError), \\ (updateError.userInfo)")}
Oppdatering av Managed Object Context
Selv om vi hånd batch oppdatering forespørsel til en administrert objekt sammenheng er forvaltet objektet sammenheng ikke klar over endringene som følge av gjennomføring av batch oppdateringen forespørsel. Som jeg nevnte tidligere, forbigår det klarte objektet sammenheng. Dette gir batch oppdateringer sin kraft og fart. For å bøte på dette problemet, må vi gjøre to ting:
slå de administrerte objekter som ble oppdatert via batch oppdateringen i feil
fortelle hentet resultater kontrolleren til å utføre en hente til oppdatere brukergrensesnitt
Dette er hva vi gjør i de neste par linjene i checkAll (_ :) metoden i do paragrafen i do-fangst uttalelse. Dersom et parti oppdatering forespørselen er vellykket, trekke vi rekken av NSManagedObjectID tilfeller fra NSBatchUpdateResult objektet.
//Extract Object IDslet objectIDs = batchUpdateResult.result som! [NSManagedObjectID]
Vi iterere over objectIDs array, spør klarte objektet kontekst for den tilsvarende NSManagedObject eksempel, og slå den inn i en feil ved å påberope refreshObject (_: mergeChanges :), passerer i forvaltet objekt som første argument . For å tvinge klarte objekt i en feil, passerer vi falsk som det andre argumentet.
//Extract Object IDslet objectIDs = batchUpdateResult.result som! [NSManagedObjectID] for objectID i objectIDs {//Ta Managed Objects inn feil la managedObject = managedObjectContext.objectWithID (objectID) managedObjectContext.refreshObject (managedObject, mergeChanges: false)}
Henter Oppdatert Records
Det siste trinnet er å fortelle hentede resultater kontrolleren til å utføre en hente å oppdatere brukergrensesnitt. Hvis dette ikke lykkes, kan vi ta feil i fangsten paragrafen i do-fangst uttalelse.
Gjøre {//Execute Batch Request la batchUpdateResult = prøve managedObjectContext.executeRequest (batchUpdateRequest) som! NSBatchUpdateResult //Extract Object IDer la objectIDs = batchUpdateResult.result som! [NSManagedObjectID] for objectID i objectIDs {//Ta Managed Objects inn feil la managedObject = managedObjectContext.objectWithID (objectID) managedObjectContext.refreshObject (managedObject, mergeChanges: falske)} //Utfør Fetch prøve self.fetchedResultsController.performFetch ()} catch { la updateError = feil som NSError print ("\\ (updateError), \\ (updateError.userInfo)")}
Selv om dette kan virke tungvint og ganske komplisert for en enkel operasjon, husk at vi omgå kjernedata stabelen. Med andre ord, må vi ta vare på noen housekeeping som vanligvis gjort for oss av kjernedata
Trinn 4:. Bygg & Kjør
Bygg prosjektet og kjøre programmet i simulatoren eller på en fysisk enhet. Klikk eller trykk på bar-knappen elementet til høyre for å sjekke hver gjøremål element i listen.
Konklusjon
Batch oppdateringer er et flott tillegg til Core data rammeverket. Ikke bare svare på et behov utviklerne har hatt i mange år, er det ikke vanskelig å gjennomføre så lenge du holde et par grunnleggende regler i tankene. I neste opplæringen, vil vi ta en nærmere titt på sats sletter, en annen funksjon av Core data rammene som ble lagt nylig. Anmeldelser