In deze zelfstudie leert u hoe u Background Fetch gebruikt, een multitasking-API die wordt meegeleverd met de iOS 7 SDK. Om dit te doen, zullen we een eenvoudige lijst maken van heerlijke gerechten die automatisch op de achtergrond worden opgehaald. Lees verder!
Achtergrond Fetch is een geweldige functie die is uitgebracht met iOS 7. Tegenwoordig leven we in een sociale wereld en de meeste van onze gebruikers hebben verschillende sociale netwerk-apps op hun mobiele apparaten. Elke keer dat de gebruiker elke app opent, moet hij echter wachten totdat de app wordt bijgewerkt om recentere inhoud te bekijken. Dit kan pijnlijk zijn als verschillende apps en profielen worden gebruikt. Met achtergrond ophalen kan nu alle inhoud automatisch worden opgehaald en bijgewerkt voordat de gebruiker de app laadt.
De standaard Traffic-toepassing is een eenvoudig voorbeeld van hoe Background Fetch in actie werkt. Als je het elke ochtend controleert, laten we zeggen om 08:20 uur, dan moet je iOS-app die informatie op dat moment krijgen. Als het besturingssysteem weet dat u de app rond 8:20 AM opent, kan het de gegevens van tevoren ophalen en klaar hebben wanneer gewenst.
Voor een meer uitgebreid overzicht van de nieuwe multitasking-functies, moet u onze inleiding tot dit onderwerp lezen. De rest van deze tutorial zal worden gewijd aan een praktisch project dat laat zien hoe Background Fetch geïmplementeerd kan worden.
De eerste stap is om een iOS 7-project te maken en de app voor één weergave te kiezen. Laten we hierna een paar eigenschappen toevoegen die nuttig zijn in de tutorial:
@property (nonatomic) NSMutableArray * -objecten; @property (nonatomic) NSArray * possibleTableData; @property (nonatomic) int numberOfnewPosts; @property (nonatomic) UIRefreshControl * refreshControl;
De NSMutableArray
objecten worden gebruikt om de objecten op te slaan die worden vermeld in de TableView. Merk op dat u in deze zelfstudie geen service zult bellen om gegevens te verkrijgen. In plaats daarvan gebruikt u de possibleTableData
array en willekeurig meerdere objecten ervan kiezen. De app kan echter eenvoudig worden verbeterd om gegevens van een server op te halen als u dat wilt.
Het gehele getal numberOfnewPosts
vertegenwoordigen de nieuwe berichten die beschikbaar zijn telkens wanneer u een aanvraag indient of een achtergrondophaal ontvangt. De refrestControl
is een controle die wordt gebruikt bij het bijwerken van taken. Omdat het buiten de tutorial context valt, zullen we het niet behandelen. Bekijk deze Mobiletuts + tutorial als je meer wilt weten.
In de Main.storyboard
, verander de ViewController
naar een UITableViewController
. Klik vervolgens op de UITableViewController
en ga naar Editor> Insluiten> Navigatiecontroller. Vergeet niet om de Custom Class in te stellen ViewController
.
Ga nu naar ViewController.m
. de eerste stap is om wat gegevens te laden. De volgende code zal het data-object toewijzen en creëren, een titel maken en de refreshControl initialiseren:
self.possibleTableData = [NSArray arrayWithObjects: @ "Pittige knoflook Lime Chicken", @ "Apple Crisp II", @ "Eggplant Parmesan II", @ "Pumpkin Ginger Cupcakes", @ "Easy Lasagna", @ "Puttanesca", @ " Alfredo Sauce ", nihil]; self.navigationItem.title = @ "Delicious Dishes"; self.refreshControl = [[UIRefreshControl alloc] init]; [self.refreshControl addTarget: self action: @selector (insertNewObject :) forControlEvents: UIControlEventValueChanged]; [self.tableView addSubview: self.refreshControl];
De bovenstaande code genereert een waarschuwing omdat de insertNewObject
methode ontbreekt. Laten we dat oplossen!
De methode genereert een willekeurig getal en krijgt exact hetzelfde aantal objecten uit de gegevensmatrix. Vervolgens wordt de tabweergave bijgewerkt met nieuwe waarden.
- (void) insertNewObject: (id) afzender self.numberOfnewPosts = [self getRandomNumberBetween: 0 to: 4]; NSLog (@ "% d nieuw ophaalobjecten", self.nummerOfnewPosts); voor (int i = 0; i < self.numberOfnewPosts; i++) int addPost = [self getRandomNumberBetween:0 to:(int)([self.possibleTableData count]-1)]; [self insertObject:[self.possibleTableData objectAtIndex:addPost]]; [self.refreshControl endRefreshing];
De getRandomNumberBetween
waarschuwing wordt onderdrukt wanneer u de volgende methode toevoegt:
-(int) getRandomNumberBetween: (int) from to: (int) to return (int) from + arc4random ()% (to-from + 1);
Om de objecten op de te laden NSArray
object, we moeten de gedelegeerde methoden van de TableView
.
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView return 1; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) sectie return self.objects.count; - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: @ "Cell" forIndexPath: indexPath]; cell.textLabel.text = self.objects [indexPath.row]; if (indexPath.row < self.numberOfnewPosts) cell.backgroundColor = [UIColor yellowColor]; else cell.backgroundColor = [UIColor whiteColor]; return cell;
Best simpel, toch? als jij Rennen
het project zal je een interface hebben die lijkt op de volgende afbeelding:
Nu wilt u de functie Achtergrond ophalen maken. Om de achtergrondophaal beschikbaar te maken, moet je naar Project> Capabilities> Zet achtergrondmodi aan en selecteer vervolgens Achtergrond ophalen, zoals weergegeven in de volgende afbeelding:
Dit alleen doen is echter niet voldoende. Standaard belt de app nooit de achtergrond-API, dus u moet de volgende regel toevoegen aan de -(BOOL) applicatie: (UIApplication *) applicatie didFinishLaunchingWithOptions: (NSDictionary *) launchOptions
methode binnen de AppDelegate.m
het dossier:
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum];
Hierdoor kan het systeem beslissen wanneer het nieuwe inhoud moet krijgen.
Nu uw app al weet hoe de achtergrond moet worden opgehaald, laten we het dan eens weten wat u moet doen. De methode -(ongeldige) toepassing: (UIApplication *) toepassing performFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler
zal hierbij helpen. Deze methode wordt elke keer dat een achtergrondophaal wordt uitgevoerd aangeroepen en moet worden opgenomen in de AppDelegate.m
het dossier. De volledige versie wordt hieronder verstrekt:
-(ongeldige) toepassing: (UIApplication *) toepassing performFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler UINavigationController * navigationController = (UINavigationController *) self.window.rootViewController; id topViewController = navigationController.topViewController; if ([topViewController isKindOfClass: [ViewController class]]) [(ViewController *) topViewController insertNewObjectForFetchWithCompletionHandler: completionHandler]; else NSLog (@ "Niet de juiste klasse% @.", [topViewController class]); completionHandler (UIBackgroundFetchResultFailed);
Vervolgens moet u ook het importeren ViewController
headerbestand in de AppDelegate.m
klasse.
#import "ViewController.h"
Merk op dat, de insertNewObjectForFetchWithCompletionHandler
was nog niet gemaakt. Dus ga naar de ViewController.h
en verklaar het.
- (void) insertNewObjectForFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler;
Richt nu uw aandacht op het implementatiebestand. De implementatie lijkt sterk op de insertNewObject
bel eerder toegevoegd. We gebruiken echter de completionHandler
om met het systeem te praten en ons te vertellen of de app nieuwe gegevens heeft opgehaald of dat er geen gegevens beschikbaar waren.
- (void) insertNewObjectForFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler NSLog (@ "Update the tableview."); self.umberOfnewPosts = [self getRandomNumberBleween: 0 to: 4]; NSLog (@ "% d nieuw ophaalobjecten", self.nummerOfnewPosts); voor (int i = 0; i < self.numberOfnewPosts; i++) int addPost = [self getRandomNumberBetween:0 to:(int)([self.possibleTableData count]-1)]; [self insertObject:[self.possibleTableData objectAtIndex:addPost]]; /* At the end of the fetch, invoke the completion handler. */ completionHandler(UIBackgroundFetchResultNewData);
Op dit punt moet de code worden voltooid. Laten we nu een test simuleren en controleren of alles goed werkt!
Dus als u zeker wilt weten of alles is geconfigureerd, moet u uw regelingen. Ga naar de regelingen lijst en klik op de Beheer schema's optie, zoals weergegeven in de volgende afbeelding:
Onder de regelingen beheer sectie kunt u het schema van uw applicatie dupliceren:
Na het dupliceren van het schema zal een nieuw venster worden gepresenteerd. U kunt de naam wijzigen van de Tabblad Opties. Controleer de Starten vanwege een achtergrondophaalactie doos. Klik nu gewoon OK in alle vensters.
Voer de app vervolgens uit met het gedupliceerde schema.
Houd er rekening mee dat de app niet op de voorgrond wordt geopend, maar dat deze al wat inhoud heeft opgehaald. Als je de app opent en er al verschillende recepten beschikbaar zijn, betekent dit dat je bent geslaagd! Om een achtergrondophaal te forceren, kunt u ook gebruiken Foutopsporing> Achtergrondoproep simuleren. uit het Xcode-menu.
Aan het einde van deze zelfstudie moet u het mechanisme voor het ophalen van de achtergrond begrijpen en weten hoe u het in uw eigen apps kunt implementeren.
Als u vragen heeft, laat deze dan achter in de opmerkingen hieronder!