iOS 7 SDK Lucrul cu preluarea de fundal

Acest tutorial vă va învăța cum să utilizați Background Fetch, un API multitasking furnizat împreună cu iOS 7 SDK. Pentru a face acest lucru, vom crea o listă simplă de mâncăruri delicioase care sunt extrase automat în fundal. Citește mai departe!


rezumatul proiectului

Descărcarea de fundal este o caracteristică minunată lansată cu iOS 7. Astăzi trăim într-o lume socială, iar majoritatea utilizatorilor noștri au mai multe aplicații de rețele sociale pe dispozitivele mobile. Cu toate acestea, de fiecare dată când utilizatorul deschide fiecare aplicație, de obicei trebuie să aștepte până când aplicația actualizează pentru a vedea conținut mai recent. Acest lucru poate fi dureros dacă se utilizează mai multe aplicații și profile. Acum, cu preluarea de fundal, tot conținutul poate fi preluat automat și actualizat înainte ca utilizatorul să încarce aplicația.

Aplicația Trafic implicită este un exemplu simplu al modului în care funcția Fetch de fundal funcționează în acțiune. Dacă o verificați în fiecare dimineață, să zicem la 8:20, aplicația dvs. pentru iOS trebuie să obțină acele informații în acel moment. Acum, dacă sistemul de operare știe că veți accesa aplicația în jurul valorii de 8:20 AM, poate prelua datele în prealabil și poate fi pregătit când doriți.

Pentru o prezentare mai completă a noilor caracteristici multitasking, nu uitați să citiți introducerea noastră la acest subiect. Restul acestui tutorial va fi dedicat unui proiect practic care demonstrează modul de implementare a aplicației Background Fetch.

1. Configurarea proiectului

Primul pas este să creați un proiect iOS 7 și să alegeți o aplicație de vizionare unică. Înainte de a adăuga câteva proprietăți care vor fi utile de-a lungul tutorialului:

 @property (nonatomic) NSMutableArray * obiecte; @property (nonatomic) NSArray * possibleTableData; @property (nonatomic) int numberOfnewPosts; @property (nonatomic) UIRefreshControl * refreshControl;

NSMutablearray obiectele vor fi folosite pentru a salva obiectele listate în TableView. Rețineți că în acest tutorial nu veți apela niciun serviciu pentru a obține date. În schimb, veți folosi possibleTableData array și selectați aleatoriu mai multe obiecte din acesta. Cu toate acestea, aplicația poate fi îmbunătățită cu ușurință pentru a prelua date de pe un server, dacă doriți.

Totul numberOfnewPosts reprezintă postările noi care sunt disponibile de fiecare dată când veți trage o solicitare sau veți primi o preluare de fundal. refrestControl este un control care se utilizează la actualizarea sarcinilor. Din moment ce nu se află în contextul tutorialului, nu o vom acoperi. Cu toate acestea, ar trebui să te uiți la acest tutorial Mobiletuts + dacă vrei să afli mai multe.

În Main.storyboard, schimba ViewController la a UITableViewController. Apoi faceți clic pe UITableViewController și du-te la Editor> Încorporați în> Controller de navigare. Nu uitați să setați clasa personalizată la ViewController.

Acum, treci la ViewController.m. primul pas este să încărcați unele date. Următorul cod va aloca și crea obiectul de date, va crea un titlu și va inițializa refreshControl:

 auto-posibleTableData = [NSArray arrayWithObjects: @ "Spicy usturoi pâine de căprioară", @ "Apple Crisp II", @ "Parmezan II vinete", @ "dovleac Ginger Cupcakes", @ "Lasagna Easy", @ "Puttanesca" Alfredo Sauce ", nil]; self.navigationItem.title = @ "Mâncăruri delicioase"; self.refreshControl = [[UIRefreshControl alocare] init]; [self.refreshControl addTarget: acțiune auto: @selector (insertNewObject :) forControlEvents: UIControlEventValueChanged]; [self.tableView addSubview: self.refreshControl];

Codul de mai sus va genera un avertisment pentru că insertNewObject metoda lipsește. Să rezolvăm asta!

Metoda va genera un număr aleator și va obține același număr exact de obiecte din matricea de date. Apoi, va actualiza vizualizarea tabelului cu noi valori.

 - (void) insertNewObject: (id) expeditor auto.numberOfnewPosts = [auto getRandomNumber între: 0 la: 4]; NSLog (@ "% d obiecte noi atrase", auto.numberOfnewPosts); pentru (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]; 

getRandomNumberBetween avertismentul va fi suprimat când adăugați următoarea metodă:

 -(int) getRandomNumber Între: (int) de la la: (int) la return (int) de la + arc4random ()% (de la + 1); 

Pentru a încărca obiectele pe NSArray obiect, trebuie să pună în aplicare metodele delegate ale TableView.

 - (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView retur 1;  - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) sectiunea return self.objects.count;  - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath UITableViewCell * celula = [tableView dequeueReusableCellWithIdentifier: @ "Celula" pentruIndexPath: indexPath]; cell.textLabel.text = auto.obiecte [indexPath.row]; în cazul în care (indexPath.row < self.numberOfnewPosts) cell.backgroundColor = [UIColor yellowColor];  else cell.backgroundColor = [UIColor whiteColor]; return cell; 

Destul de simplu, nu? daca tu Alerga proiectul va avea o interfață similară cu următoarea imagine:



2. Background Fetch

Acum, doriți să creați funcția Fetch de fundal. Pentru a face disponibilă fundalul, trebuie să mergeți la Proiect> Capabilități> Puneți modurile de fundal ON apoi selectați Background Fetch, așa cum este prezentat în figura următoare:


Totuși, acest lucru nu este suficient. În mod implicit, aplicația nu va apela API-ul de fundal, deci trebuie să adăugați următoarea linie la -(BOOL): aplicație (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions metoda în cadrul AppDelegate.m fişier:

 [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum];

Acest lucru va permite sistemului să decidă când va primi conținut nou.

Acum că aplicația dvs. deja știe să inițieze preluarea de fundal, să-i spunem ce să facem. Metoda -(void) cerere: (UIApplication *) cerere performFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler va ajuta în acest sens. Această metodă se numește de fiecare dată când este efectuată o preluare de fundal și ar trebui inclusă în AppDelegate.m fişier. Versiunea completă este furnizată mai jos:

 -(void) aplicație: (UIApplication *) aplicație performFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completareHandler UINavigationController * navigationController = (UINavigationController *) self.window.rootViewController; id topViewController = navigationController.topViewController; dacă [[topViewController esteKindOfClass: [ViewController class]]) [(ViewController *) topViewController insertNewObjectForFetchWithCompletionHandler: completionHandler];  altceva NSLog (@ "Nu clasa potrivită% @", [clasa topViewController]); completionHandler (UIBackgroundFetchResultFailed); 

Apoi trebuie să importați și ViewController antet fișier în AppDelegate.m clasă.

 #import "ViewController.h"

Rețineți că, insertNewObjectForFetchWithCompletionHandler încă nu a fost creată. Deci, treceți la ViewController.h și o declarați.

 - (void) insertNewObjectForFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completareHandler;

Acum, concentrați atenția asupra fișierului de implementare. Implementarea este foarte asemănătoare insertNewObject apel adăugat înainte. Cu toate acestea, folosim completionHandler pentru a vorbi cu sistemul și a ne spune dacă aplicația a adus date noi sau dacă nu au fost disponibile date.

 - (void) insertNewObjectForFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler NSLog (@ "Actualizați vizualizarea tabelului."); auto.numberOfnewPosts = [auto getRandomNumber între: 0 până la: 4]; NSLog (@ "% d obiecte noi atrase", auto.numberOfnewPosts); pentru (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); 

În acest moment, codul trebuie completat. Acum, să simulăm un test și să verificăm că totul este în desfășurare!


3. Figura de simulare a fundalului

Deci, dacă doriți să vă asigurați că totul este configurat, trebuie să vă editați Scheme. Mergeți la Scheme listă și faceți clic pe Gestionați schemele opțiune, după cum se prezintă în figura următoare:


Sub Scheme puteți să copiați schema aplicației:


După duplicarea schemei va fi prezentată o nouă fereastră. Puteți schimba numele de la Tab. Opțiuni. Verifică Lansați din cauza unui eveniment de preluare a fundalului cutie. Acum, faceți clic pe O.K în toate ferestrele.


Apoi, executați aplicația folosind schema duplicată.
Rețineți că aplicația nu se va deschide în prim-plan, dar ar fi trebuit să preia deja conținut. Dacă deschideți aplicația și mai multe rețete sunt deja disponibile, înseamnă că ați reușit! Pentru a forța o preluare de fundal, puteți, de asemenea, să o utilizați Debug> Simulați preluarea fundalului. din meniul Xcode.


Concluzie

La sfârșitul acestui tutorial, trebuie să înțelegeți mecanismul de preluare a fundalului și modul de implementare a acestuia în propriile aplicații.

Dacă aveți întrebări, lăsați-le în secțiunea de comentarii de mai jos!

Cod