Het bijhouden van toepassingsgegevens gesynchroniseerd tussen apparaten is een complexe en ontmoedigende taak. Gelukkig is dat precies waarom Apple iCloud heeft gebouwd. In deze Tuts + Premium-serie leert u hoe iCloud werkt en hoe uw applicaties naadloos gegevens kunnen delen op meerdere apparaten.
In de eerste aflevering van deze serie gaf ik een inleiding tot iCloud en richtte ik me vooral op iCloud-opslag. Er zijn twee soorten iCloud-opslag beschikbaar voor ontwikkelaars, Key-Value Storage en Documentopslag. Sleutelwaardeopslag staat centraal in deze zelfstudie.
We beginnen deze zelfstudie door het proces van het instellen van een toepassing voor gebruik met iCloud van naderbij te bekijken. Als onze applicatie correct is geconfigureerd, maken we gebruik van iCloud's Key-Value Storage om de gegevens van onze applicatie gesynchroniseerd te houden over meerdere apparaten.
We kunnen gegevenssynchronisatie niet testen met slechts één apparaat. Om deze tutorial te voltooien, moet u ten minste twee iOS-apparaten hebben met iOS 5 of hoger. Helaas kan de iOS Simulator niet worden gebruikt om iCloud-opslag te testen.
De applicatie die we gaan bouwen zal een eenvoudige iOS-applicatie zijn, wat betekent dat je het kunt gebruiken op elke iPhone, iPod Touch of iPad met iOS 5 of hoger. Het lezen van deze tutorial is nog steeds de moeite waard, zelfs als je geen twee afzonderlijke iOS-apparaten hebt om te testen. Het zal u leren hoe iCloud is ingesteld en hoe u iCloud's Key-Value Storage kunt gebruiken om uw eigen applicaties te verbeteren.
Ik zal beginnen met je te begeleiden bij het configureren van onze applicatie om iCloud-opslag te gebruiken. We moeten echter eerst ons Xcode-project opzetten.
Maak een nieuw project in Xcode door de. Te selecteren Toepassing enkele weergave sjabloon. Geef je sollicitatie een naam Bewolkt, voer een in bedrijfsidentificatie, reeks iPhone voor de apparaatfamilie en vink aan Gebruik automatische referentietelling. De resterende selectievakjes moeten uitgeschakeld zijn. Vertel Xcode waar je je project wilt opslaan en klik creëren.
Het is belangrijk dat u zorgvuldig het productnaam en bedrijfsidentificatie voor dit project. De combinatie van deze twee elementen vormt de bundelidentificatie (samen met de bundelzaad-id) van uw toepassing, die iCloud zal gebruiken om uw toepassing op unieke wijze te identificeren. Controleer uw spelling zorgvuldig, omdat de bundel-ID hoofdlettergevoelig is.
Zoals ik in het eerste artikel van deze Tuts + Premium-serie al zei, is het opzetten van een toepassing om iCloud te gebruiken eenvoudig en er zijn slechts twee stappen nodig. Laat me je stap voor stap door het proces leiden.
Open uw favoriete browser en ga naar het iOS Dev Center van Apple. Meld u aan bij uw iOS-ontwikkelaarsaccount en klik op de iOS provisioning portal link aan de rechterkant.
Eerst moeten we een maken App-ID voor onze toepassing. Open de App-ID's tab aan de linkerkant en klik op de Nieuwe app-ID knop rechtsboven. Geef uw app-ID een beschrijvende naam om deze later gemakkelijk te kunnen identificeren. Voer vervolgens de bundel-ID in waar ik het zojuist over had. De bundel-ID is de combinatie van uw bedrijfsidentificatie, com.mobiletuts in ons voorbeeld en de productnaam, Bewolkt in ons voorbeeld. U kunt de identificatie-set bundelzaad op laten staan Gebruik Team ID, wat goed is voor onze applicatie.
Controleer nogmaals of uw bundel-ID correct is gespeld. Zoals ik eerder al zei, is de bunder-identifier hoofdlettergevoelig. Klik op de knop Verzenden om uw app-ID te maken.
Uw nieuw gemaakte app-ID moet nu aanwezig zijn in de lijst met app-ID's. U zult merken dat iCloud standaard is uitgeschakeld voor elke nieuw gemaakte app-ID. Laten we dat veranderen. Klik aan de rechterkant van uw app-ID op configureren knop. Onderaan de pagina ziet u een selectievakje waarin staat Inschakelen voor iCloud. Vink het selectievakje aan en klik op Gedaan. Onze app-ID is nu geconfigureerd om met iCloud te werken. Er is nog iets dat we moeten regelen terwijl we ons in de Provisioning Portal.
Om ervoor te zorgen dat onze applicatie op onze apparaten kan worden uitgevoerd, moeten we een provisioningprofiel maken. Nog steeds in de iOS Provisioning Portal, open de provisioning tab aan de linkerkant en selecteer de Ontwikkeling tab bovenaan. Klik op de Nieuw profiel knop in de rechterbovenhoek en voer een beschrijvende naam in voor uw nieuwe profiel. Selecteer vervolgens het ontwikkelingscertificaat waaraan u het profiel wilt koppelen en kies de juiste app-ID in de vervolgkeuzelijst. Selecteer tot slot de apparaten die u wilt testen in de lijst helemaal onderaan de pagina.
Nadat u rechts onderaan op de knop Verzenden hebt geklikt, ziet u dat uw inrichtingsprofiel de status heeft In afwachting. Nadat de pagina opnieuw is geladen, moet de status van het profiel zijn bijgewerkt Actief. Klik op de downloadknop naast uw voorzieningenprofiel en dubbelklik op het profiel. Xcode zal het profiel automatisch voor u installeren.
Veel ontwikkelaars ineenkrimpen als ze het woord horen aanspraken. Rechten zijn niets om bang voor te zijn als je eenmaal begrijpt waarvoor ze zijn. Rechten geven specifieke mogelijkheden of beveiligingsbevoegdheden aan een applicatie. Dat is alles wat er is. Het is een eenvoudige lijst met sleutel / waarde-paren die het besturingssysteem vertellen wat uw toepassing wel en niet mag en welke toepassingen toegang hebben tot de gegevens van uw toepassing. Dit laatste is vooral belangrijk bij het werken met iCloud.
In ons voorbeeld, iCloud-rechten, laten we iCloud Storage inschakelen voor onze applicatie. Om de rechten van onze applicatie te configureren, gaan we naar de doel-editor van Xcode.
Klik op ons project in de Project Navigator en selecteer ons doel in de lijst met doelen. Met de Samenvatting tabblad geselecteerd, zou u een sectie met de naam moeten zien rechten aan de onderkant. Vink het eerste selectievakje aan om rechten voor onze toepassing in te schakelen. Met deze optie wordt een rechtenbestand voor onze toepassing gemaakt. Het tekstveld onder het selectievakje moet voor u worden ingevuld. We hebben nu de optie om iCloud Key-Value Storage en iCloud Document Storage in te schakelen.
In deze zelfstudie zal ik alleen praten over iCloud Key-Value Storage, dus vink het selectievakje aan naast iCloud Key-Value Store. Nogmaals, Xcode vult het tekstveld naast het selectievakje in met uw toepassingsbundel-ID (zonder de bundelzaad-id). Controleer of dit bundel-ID overeenkomt met het ID dat u hebt ingevoerd in het inrichtingsportaal toen u uw app-ID maakte. Ik zal het in de volgende tutorial hebben over iCloud-containers als ze betrekking hebben op iCloud-documentopslag.
Onder aan het gedeelte Rechten ziet u Sleutelhangertoegangsgroepen. Deze lijst geeft aan welke applicaties toegang hebben tot de keychain-items van uw applicaties. U kunt dat gedeelte voorlopig onaangetast laten.
Voordat we onze handen vuil maken met de iCloud-API's, moeten we onze build-instellingen configureren. Selecteer de. In de doeleditor van Xcode Bouw instellingen tab en scrol omlaag naar de Code Signing sectie. Stel de code-ondertekeningsidentiteit in voor de debug en Vrijlating configuraties die overeenkomen met het profiel dat we zojuist hebben gemaakt in de iOS provisioning portal.
Deze tutorial is enigszins geavanceerd en ik ga er daarom vanuit dat je bekend bent met de basisbegrippen van iOS-ontwikkeling. Dit betekent dat ik een beetje sneller zal bewegen dan normaal, omdat we veel terrein moeten overbruggen.
De applicatie die we gaan bouwen zal een eenvoudige bookmarks manager zijn. We kunnen bladwijzers toevoegen en verwijderen en onze bladwijzers worden op al onze apparaten gesynchroniseerd. Hoe cool is dat? Laten we beginnen.
Open het header-bestand van onze view controller en maak een instantievariabele (ivar) van het type NSMutableArray
met een naam van bladwijzers. De ivar slaat onze bladwijzers op. De bladwijzers worden weergegeven in een tabelweergave. Maak een outlet voor de tabelweergave in het header-bestand van onze viewcontroller en zorg ervoor dat onze view controller overeenkomt met de tabelview-gegevensbron en delegatieprotocollen. Vergeet ook niet om accessors voor beide eigenschappen te synthetiseren in het implementatiebestand van onze view-controller. Voeg vervolgens twee acties toe aan ViewController.h, editBookmarks: en Voeg bladwijzer toe:. Klaar? Ga naar de ViewController.xib bestand om alles op te zetten.
#importeren@interface ViewController: UIViewController NSMutableArray * _bookmarks; __weak UITableView * _tableView; @property (nonatomic, strong) NSMutableArray * bladwijzers; @property (nonatomic, weak) IBOutlet UITableView * tableView; - (IBAction) editBookmarks: (id) afzender; - (IBAction) addBookmark: (id) afzender; @einde
Begin met het slepen van een navigatiebalk naar het aanzicht van onze view controller en plaats deze helemaal bovenin. Sleep een instantie van UIBarButtonItem
aan de linkerkant van de navigatiebalk en stel de ID in de Kenmerken Inspector naar Bewerk. Regel het slepen van de bewerkknop naar onze Bestand eigenaar en selecteer de editBookmarks: methode. Versleep een tweede staafknopitem rechts van de navigatiebalk en geef het een ID van Toevoegen. Regel het slepen vanaf de knop Toevoegen naar onze Bestand eigenaar en selecteer de Voeg bladwijzer toe: methode. Sleep ten slotte een exemplaar van UITableView
naar de mening van onze controlecontroller en verbindt zijn gegevensbron en delegeert verkooppunten met de Bestand eigenaar voorwerp. Gedaan.
De implementatie van de gegevensbron en de deelnemersprotocollen van onze tabelweergave is eenvoudig en duidelijk. In de numberOfSectionsInTableView: methode, controleren we of onze gegevensbron, dat wil zeggen onze bladwijzers, niet nul is. Als het nihil is, keren we terug. Als dit niet het geval is, geven we 0 terug tableView: numberOfRowsInSection: methode is bijna identiek. Als onze gegevensbron niet nul is, retourneren we het aantal elementen dat deze bevat. Als onze gegevensbron nul is, retourneren we 0.
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView if (self.bookmarks) return 1; else retourneer 0; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section if (! Self.bookmarks) terug 0; else return self.bookmarks.count;
In de tableView: cellForRowAtIndexPath: methode, beginnen we met het declareren van een statische cel-identifier voor het doel van celhergebruik en vragen we vervolgens de tabelweergave voor een herbruikbare cel met de celidentificatie die we zojuist hebben gedeclareerd. Als een herbruikbare cel niet is geretourneerd, initialiseren we een nieuwe cel met een stijl van UITableViewCellStyleSubtitle
en we geven onze cel-ID door voor hergebruik van cellen. Vervolgens halen we de juiste bladwijzer uit de gegevensbron. Elke bladwijzer zal een woordenboek zijn met twee sleutel / waarde-paren, een naam en een URL. We configureren de cel door het label en het detaillabel in te stellen met respectievelijk de naam en URL van de bladwijzer.
- (UITableViewCell *) tableView: (UITableView *) aTableView cellForRowAtIndexPath: (NSIndexPath *) indexPath static NSString * CellIdentifier = @ "Cell Identifier"; UITableViewCell * cell = [aTableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cell == nil) cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: CellIdentifier]; // Bladwijzer ophalen NSDictionary * bladwijzer = [object.objecten objectAtIndex: indexPath.row]; // Configure Cell cell.textLabel.text = [bladwijzerobjectForKey: @ "naam"]; cell.detailTextLabel.text = [bladwijzerobjectForKey: @ "url"]; terugkeer cel;
De gebruiker heeft ook de mogelijkheid om zijn bladwijzers te bewerken. In de tableView: canEditRowAtIndexPath: methode we terugkeren JA. De tableView: commitEditingStyle: forRowAtIndexPath: is iets complexer. We beginnen met het verifiëren dat de bewerkingsstijl van de cel gelijk is aan UITableViewCellEditingStyleDelete
, dat wil zeggen dat een bladwijzer is verwijderd. Ten eerste werken we onze gegevensbron bij door de bladwijzer uit de bladwijzerarray te verwijderen. Vervolgens slaan we de gegevensbron op door onze view-controller a te verzenden saveBookmarks bericht en we werken ten slotte de tabelweergave bij met de wijzigingen die we in de gegevensbron hebben doorgevoerd.
- (BOOL) tableView: (UITableView *) tableView canEditRowAtIndexPath: (NSIndexPath *) indexPath return YES; - (void) tableView: (UITableView *) aTableView commitEditingStyle: (UITableViewCellEditingStyle) editingStyle forRowAtIndexPath: (NSIndexPath *) indexPath if (editingStyle == UITableViewCellEditingStyleDelete) // Update Bookmarks [self.bookmarks removeObjectAtIndex: indexPath.row]; // Bewaar Bladwijzers [self saveBookmarks]; // Tabelweergave bijwerken [aTableView deleteRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] withRowAnimation: UITableViewRowAnimationFade];
Laten we nu eens naar onze acties kijken. De editBookmarks: methode kan niet eenvoudiger zijn. We schakelen de bewerkingsstatus van de tabelweergave op een geanimeerde manier om.
- (IBAction) editBookmarks: (id) afzender [self.tableView setEditing:! Self.tableView.editing geanimeerd: YES];
De Voeg bladwijzer toe: methode vereist een beetje meer werk. We initialiseren een nieuw exemplaar van AddBookmarkViewController
, een view controller die we binnenkort zullen maken, en we hebben zijn view controller property ingesteld op zelf
. Vervolgens presenteren we de zojuist gemaakte view controller modaal. Zoals de naam al aangeeft, AddBookmarkViewController
is verantwoordelijk voor het maken van nieuwe bladwijzers. Laten we eens goed kijken AddBookmarkViewController
.
- (IBAction) addBookmark: (id) afzender // Initialize Voeg bladwijzer toe View Controller AddBookmarkViewController * vc = [[AddBookmarkViewController alloc] initWithNibName: @ "AddBookmarkViewController" bundel: [NSBundle mainBundle]]; vc.viewController = zelf; / / Present View Controller Modally [self presentViewController: vc geanimeerd: YES completion: nil];
De implementatie van AddBookmarkViewController
is heel eenvoudig, dus ik zal niet te veel in detail treden. De weergavecontroller heeft een zwakke verwijzing naar onze hoofdweergavecontroller. Hiermee kan onze hoofdcontroller worden geïnformeerd wanneer een nieuwe bladwijzer is gemaakt. Het heeft ook twee uitgangen van het type UITextField
, waarmee de gebruiker een naam en een URL kan invoeren voor elke bladwijzer.
#importeren@class ViewController; @interface AddBookmarkViewController: UIViewController __ zwakke ViewController * _viewController; __weak UITextField * _nameField; __weak UITextField * _urlField; @property (nonatomic, weak) ViewController * viewController; @property (nonatomic, weak) IBOutlet UITextField * nameField; @property (nonatomic, weak) IBOutlet UITextField * urlField; @einde
Het XIB-bestand bevat bovenaan een navigatiebalk met een annuleren en een opslaan knop. De weergave zelf bevat de velden Naam en URL-tekst die ik zojuist heb genoemd. De knoppen Annuleren en Opslaan zijn verbonden met a annuleren: en een opslaan: actie, respectievelijk. De annuleren: actie verwerpt eenvoudigweg onze modale view controller. De opslaan: actie is net zo eenvoudig. We maken een nieuwe bladwijzer (d.w.z. een exemplaar van NSDictionary
) met de gegevens die de gebruiker in de tekstvelden heeft ingevoerd en vertel het onze hoofdcontroller over de nieuwe bladwijzer. Het is belangrijk op te merken dat dit niet de beste oplossing is om onze hoofdcontroller te laten weten wanneer een nieuwe bladwijzer is gemaakt door onze AddBookmarkViewController
. Deze benadering introduceert een strakke koppeling, die zoveel mogelijk moet worden vermeden. Een betere benadering zou zijn om het patroon van de delegatie over te nemen.
- (IBAction) cancel: (id) afzender [self dismissViewControllerAnimated: YES completion: nil]; - (IBAction) opslaan: (id) afzender NSString * name = self.nameField.text; NSString * url = self.urlField.text; NSDictionary * bookmark = [[NSDictionary alloc] initWithObjectsAndKeys: name, @ "name", url, @ "url", nihil]; [self.viewController saveBookmark: bookmark]; [self dismissViewControllerAnimated: YES completion: nil];
We zijn bijna klaar, maar we moeten dat nog steeds implementeren saveBookmark: methode in onze hoofdweergavecontroller. Begin met het declareren van deze methode in het header-bestand van onze view controller en ga vervolgens naar het implementatiebestand. De implementatie is minimaal. We voegen de nieuw gemaakte bladwijzer toe aan onze gegevensbron, we slaan de gegevensbron op en vervolgens herladen we de tabelweergave om de bladwijzer weer te geven die we zojuist hebben toegevoegd.
- (void) saveBookmark: (NSDictionary *) bookmark // Voeg bladwijzer toe aan bladwijzers [self.bookmarks addObject: bookmark]; // Bewaar Bladwijzers [self saveBookmarks]; // Reload Table View [self.tableView reloadData];
Onze applicatie is niet erg handig als de bladwijzers van de gebruiker niet op de harde schijf worden opgeslagen. De gebruiker verliest zijn bladwijzers telkens wanneer de toepassing wordt afgesloten. Slechte gebruikerservaring. Laten we dit oplossen.
In onze viewDidLoad: methode sturen we onze view controller a loadBookmarks bericht. Laten we eens kijken naar de loadBookmarks methode. We slaan de bladwijzers van de gebruiker op in de standaard gebruikersdatabase. We controleren eerst of er al een vermelding in de gebruikersstandaarddatabase is met de sleutel bladwijzers
. Als dit het geval is, initialiseren we onze bladwijzers met de inhoud van het opgeslagen object. Als dit niet het geval is, initialiseren we onze bladwijzers met een lege mutable array en slaan die array op in de database met gebruikersstandaarden. Eenvoudig. Rechts?
- (void) viewDidLoad [super viewDidLoad]; // Bladwijzers laden [zelfladende bladwijzers];
- (void) loadBookmarks NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; if ([ud objectForKey: @ "bladwijzers"]! = nil) // Plaats lokale kopie laden self.bookmarks = [NSMutableArray arrayWithArray: [ud objectForKey: @ "bladwijzers"]]; else // Bookmarks initialiseren self.bookmarks = [[NSMutableArray alloc] init]; // Bewaar Lokale kopie [ud setObject: self.bookmarks forKey: @ "bladwijzers"];
Het opslaan van de bladwijzers is nog eenvoudiger. We slaan ons bookmarks-object op in de standaard gebruikersdatabase met behulp van de sleutel bladwijzers
. Dat is alles wat er is.
- (void) saveBookmarks NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; [ud setObject: self.bookmarks forKey: @ "bladwijzers"];
Dat was best een beetje werk. U kunt nu uw applicatie bouwen en uitvoeren. U zou bladwijzers moeten kunnen toevoegen en bladwijzers moeten kunnen verwijderen. De bladwijzers worden op schijf opgeslagen, zodat u geen gegevens verliest wanneer u de toepassing afsluit.
Om onze applicatie echt te doen stralen, zullen we iCloud gebruiken om onze bladwijzers op al onze apparaten gesynchroniseerd te houden. Het zal je verbazen hoe makkelijk dit is. Zoals ik al zei in de vorige tutorial van deze serie, werkt iCloud's Key-Value Storage heel veel NSUserDefaults
, dat wil zeggen dat het sleutel / waarde-paren opslaat. In iCloud-terminologie wordt de winkel genoemd NSUbiquitousKeyValueStore
. Laten we beginnen met het opslaan van onze bladwijzers, niet alleen lokaal, maar ook voor iCloud.
Ga naar onze saveBookmarks: methode en wijzig onze methode zodat deze eruitziet als de onderstaande. We beginnen met het ophalen van een verwijzing naar de standaard winkel door te bellen defaultStore op de NSUbiquitousKeyValueStore
klasse. Nogmaals, dit is erg vergelijkbaar met NSUserDefaults
. Als onze verwijzing naar de winkel niet nul is, slaan we ons bookmarks-object op in de winkel met dezelfde sleutel die we gebruikten om onze bladwijzers op te slaan in de database met gebruikersstandaarden. Ten slotte synchroniseren we de winkel.
- (void) saveBookmarks // Save Local Copy NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; [ud setObject: self.bookmarks forKey: @ "bladwijzers"]; // Opslaan in iCloud NSUbiquitousKeyValueStore * store = [NSUbiquitousKeyValueStore defaultStore]; if (store! = nil) [store setObject: self.bookmarks forKey: @ "bladwijzers"]; [winkel synchroniseren];
Roeping synchroniseren in de Store-instantie worden de sleutels en waarden in het geheugen gesynchroniseerd met degene die op de schijf zijn opgeslagen. Je zou denken dat deze methode ervoor zorgt dat er nieuwe sleutel / waarde-paren naar iCloud worden gestuurd, maar dit is niet het geval. Door de in-memory-sleutels op schijf op te slaan, wordt iCloud op de hoogte gebracht dat er nieuwe sleutel-waardeparen beschikbaar zijn om te worden gesynchroniseerd. Het is echter het besturingssysteem dat uiteindelijk beslist wanneer het passend is om de nieuw toegevoegde sleutel / waarde-paren te synchroniseren met iCloud. Dit is belangrijk om in gedachten te houden en dit is ook de reden waarom wijzigingen die op het ene apparaat zijn aangebracht, niet meteen zichtbaar zullen zijn op een ander apparaat.
Ook al hebben we de gesynchroniseerd methode op de store-instantie, dit is in de meeste situaties niet nodig. Het besturingssysteem doet dit voor u op de juiste tijden. Wist je dat NSUserDefaults
heeft een synchroniseren methode ook die vrijwel identiek werkt?
U vraagt zich misschien af hoe onze applicatie weet wanneer een ander apparaat de Key-Value Store in iCloud heeft bijgewerkt en hoe het die wijzigingen kan aanbrengen. Dit is een zeer goede vraag en dit is het laatste stukje van de puzzel.
Telkens wanneer de Key-Value Store is gewijzigd, wordt een melding verzonden en kan onze applicatie zich registreren als een obeserver voor deze meldingen. Het is belangrijk dat u zich zo vroeg mogelijk registreert voor dergelijke meldingen in de levenscyclus van uw toepassing.
Laten we kijken hoe dit werkt. In onze viewDidLoad methode doen we vier dingen. Eerst krijgen we een verwijzing naar de Key-Value Store. Ten tweede voegen we onze view controller toe als waarnemer voor alle meldingen met de naam NSUbiquitousKeyValueStoreDidChangeExternallyNotification
verzonden door de Key-Value Store. Wanneer we een dergelijke melding ontvangen, zullen we deze melding behandelen in onze updateKeyValuePairs: methode (die we in een ogenblik zullen schrijven). Vervolgens sturen we de winkel een bericht van synchroniseren. Ten slotte laden we onze bladwijzers zoals we eerder deden.
- (void) viewDidLoad [super viewDidLoad]; NSUbiquitousKeyValueStore * store = [NSUbiquitousKeyValueStore defaultStore]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (updateKeyValuePairs :) naam: NSUbiquitousKeyValueStoreDidChangeExternallyNotification-object: opslaan]; // Synchroniseer Winkel [winkel synchroniseren]; // Bladwijzers laden [zelfladende bladwijzers];
Het enige dat u hoeft te doen, is het implementeren van updateKeyValuePairs: methode. Laten we dat nu doen. De melding is gebruikers informatie
woordenboek bevat twee belangrijke sleutel / waarde-paren, (1) de reden waarom de kennisgeving werd verzonden en (2) de toetsen in de Key-Value Store waarvan de waarden zijn veranderd. We beginnen met het bekijken van de reden van de melding. We zorgen er eerst voor dat een reden is opgegeven en terugkeren als er geen is opgegeven. Als een reden inderdaad is opgegeven, gaan we alleen verder als de reden een wijziging op de server was (NSUbiquitousKeyValueStoreServerChange
) of lokale wijzigingen werden genegeerd vanwege een initiële synchronisatie met de server (NSUbiquitousKeyValueStoreInitialSyncChange
). Als aan een van deze criteria is voldaan, halen we de reeks sleutels tevoorschijn die is gewijzigd. We herhalen de toetsen om te zien of onze bladwijzertoets daaronder valt. Als dit het geval is, nemen we de waarde die aan de sleutel is gekoppeld en werken we onze gegevensbron en de database met gebruikersstandaarden bij met deze waarde. Ten slotte laden we de tabelweergave opnieuw om de wijzigingen te weerspiegelen.
- (void) updateKeyValuePairs: (NSNotification *) notificatie NSDictionary * userInfo = [notification userInfo]; NSNumber * changeReason = [userInfo objectForKey: NSUbiquitousKeyValueStoreChangeReasonkey]; NSInteger reden = -1; // Is een reden opgegeven? if (! changeReason) terug; else reason = [changeReason integerValue]; // Doorgaan als reden was (1) wijzigingen op de server of (2) Initiële synchronisatie als ((reden == NSUbiquitousKeyValueStoreServerChange) || (reden == NSUbiquitousKeyValueStoreInitialSyncChange)) NSArray * changedKeys = [userInfo-objectForKey: NSUbiquitousKeyValueStoreChangedKeysKey]; NSUbiquitousKeyValueStore * store = [NSUbiquitousKeyValueStore defaultStore]; // Zoektoetsen voor "bladwijzers" Sleutel voor (NSString * -sleutel in changedKeys) if ([key isEqualToString: @ "bladwijzers"]) // Update gegevensbron self.bookmarks = [NSMutableArray-arrayWithArray: [store objectForKey: sleutel] ]; // Bewaar Lokale kopie NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; [ud setObject: self.bookmarks forKey: @ "bladwijzers"]; // Reload Table View [self.tableView reloadData];
Er zijn twee punten die speciale aandacht vereisen. Ten eerste, zoals we zagen bij de implementatie van updateKeyValuePairs:, we ontvangen een array met alle sleutels in de Key-Value Store met waarden die zijn gewijzigd. Dit is een opimisatie om te voorkomen dat iCloud een melding moet verzenden voor elk sleutel / waarde-paar dat is gewijzigd. Ten tweede wordt het ten zeerste aanbevolen dat u alle gegevens van de Key-Value Store lokaal opslaat. De standaard gebruikersdatabase is hiervoor geschikt, maar u bent vrij om te kiezen welke oplossing bij u past. De reden voor het opslaan van een lokale kopie is om niet te vertrouwen op iCloud voor gegevensopslag. Niet elke gebruiker zal een iCloud-account hebben of iCloud op hun apparaat hebben ingeschakeld.
Met dit laatste stukje code op zijn plaats, is onze applicatie nu iCloud ingeschakeld. Bouw en run uw applicatie op twee apparaten en test deze zelf. Merk op dat veranderingen niet onmiddellijk zijn. Wijzigingen moeten worden gesynchroniseerd met de iCloud-servers en vervolgens worden verzonden naar de juiste apparaten die moeten worden bijgewerkt.
Hoewel dit tuturium lang is, vereiste de implementatie van iCloud Key-Value Storage niet zo veel extra code. Zoals ik in de vorige zelfstudie schreef, is het gebruik van Key-Value Storage eenvoudig, rechtlijnig en vereist heel weinig overhead van jouw kant.
Voordat ik deze tutorial afrond, wil ik de voor- en nadelen van iCloud Key-Value Storage herhalen, omdat ze belangrijk zijn om in gedachten te houden. De pro's liggen nu voor de hand, het is gemakkelijk vast te stellen, snel te implementeren en het lijkt erg op hoe NSUserDefaults
werken. Het is echter ook belangrijk om de nadelen in gedachten te houden. Key-value-paren zijn wat ze zijn. Dat wil zeggen, eenvoudige paren zonder enige vorm van conflicthantering, tenzij u uw eigen logica voor conflicthantering implementeert. Dit laatste wordt niet aanbevolen, omdat Key-Value Storage hier niet op is gebouwd. Documentopslag biedt ingebouwde conflictondersteuning en is daarom een veel betere optie als u conflictafhandeling nodig hebt. Vergeet ten slotte niet dat Key-Value-opslag slechts 1 MB aan gegevens kan opslaan met een maximum van 1024 sleutel / waarde-paren. Hoewel we Key-Value Storage in deze toepassing hebben gebruikt voor illustratiedoeleinden, kunnen we niet garanderen dat er nooit een gebruiker zal zijn met een lijst met bladwijzers die de limiet van 1 MB overschrijdt.
Ik wil ook benadrukken dat het doel van onze applicatie is om u te laten zien hoe u Key-Value Storage kunt gebruiken en hoe het achter de schermen werkt. Dit is op geen enkele manier een applicatie die klaar is voor uitgave, omdat deze op verschillende manieren niet kogelvrij is.
In deze zelfstudie hebben we geleerd hoe je een app kunt instellen voor gebruik met Apple's iCloud. We hebben ook iCloud Key-Value Storage nader bekeken. In de volgende zelfstudie concentreren we ons op het andere type iCloud-opslag: Documentopslag. Dit type iCloud-opslag is bedoeld voor zware data-applicaties en dat is precies wat we in de volgende tutorial zullen bouwen.