Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«iOS. ΠŸΡ€ΠΈΠ΅ΠΌΡ‹ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 121

Автор Π’Π°Π½Π΄Π°Π΄ Нахавандипур

#import <Foundation/Foundation.h>


@interface NewsItem: NSObject


@property (nonatomic, strong) NSDate *date;

@property (nonatomic, copy) NSString *text;


@end


Π£ этого класса Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, поэтому всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ нСсти Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² свойствах. ВозвращаСмся ΠΊ Π΄Π΅Π»Π΅Π³Π°Ρ‚Ρƒ нашСго прилоТСния ΠΈ опрСдСляСм измСняСмый массив новостСй. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ смоТСм Π·Π°ΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ этот массив Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ новостныС элСмСнты:


#import <UIKit/UIKit.h>


@interface AppDelegate: UIResponder <UIApplicationDelegate>


@property (nonatomic, strong) UIWindow *window;

@property (nonatomic, strong) NSMutableArray *allNewsItems;


@end


Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ массива. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ массив Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ прямо ΠΊ Π½Π΅ΠΌΡƒ Π½Π΅ обратится. Π’Π°ΠΊ экономится ΠΏΠ°ΠΌΡΡ‚ΡŒ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ массив Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½, ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ Π½Π΅ΠΌΡƒ ΠΎΠ΄ΠΈΠ½ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт:


#import Β«AppDelegate.hΒ»

#import Β«NewsItem.hΒ»

@implementation AppDelegate


β€” (NSMutableArray *) allNewsItems{

if (_allNewsItems == nil){

_allNewsItems = [[NSMutableArray alloc] init];


/* Π—Π°Ρ€Π°Π½Π΅Π΅ записываСм Π² массив ΠΎΠ΄ΠΈΠ½ элСмСнт */

NewsItem *item = [[NewsItem alloc] init];

item.date = [NSDate date];

item.text = [NSString stringWithFormat:@"News text 1"];

[_allNewsItems addObject: item];


}

return _allNewsItems;

}

<# ΠžΡΡ‚Π°Ρ‚ΠΎΠΊ ΠΊΠΎΠ΄Π° Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° вашСго прилоТСния находится здСсь #>


Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Π² нашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² сСрвСра. МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ здСсь ΠΌΡ‹ ΠΈΠ³Ρ€Π°Π΅ΠΌ Π² орлянку. Π’ΠΎΡ‡Π½Π΅Π΅, ΠΌΠ΅Ρ‚ΠΎΠ΄ случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… чисСл β€” 0 ΠΈΠ»ΠΈ 1. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² 1, ΠΌΡ‹ считаСм, Ρ‡Ρ‚ΠΎ Π½Π° сСрвСрС Π΅ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ новостныС ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² 0, считаСм, Ρ‡Ρ‚ΠΎ такая новая информация Π½Π° сСрвСрС отсутствуСт. Если ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ 1, Ρ‚ΠΎ сразу послС этого добавляСм Π² список Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт:


β€” (void) fetchNewsItems:(BOOL *)paramFetchedNewItems{


if (arc4random_uniform(2)!= 1){

if (paramFetchedNewItems!= nil){

*paramFetchedNewItems = NO;

}

return;

}


[self willChangeValueForKey:@"allNewsItems"];


/* Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт */

NewsItem *item = [[NewsItem alloc] init];

item.date = [NSDate date];

item.text = [NSString stringWithFormat:@"News text %lu",

(unsigned long)self.allNewsItems.count + 1];

[self.allNewsItems addObject: item];

if (paramFetchedNewItems!= nil){

*paramFetchedNewItems = YES;

}


[self didChangeValueForKey:@"allNewsItems"];


}


ЛогичСский ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ указатСля этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° сообщит Π½Π°ΠΌ, появилась Π»ΠΈ новая информация, добавлСнная Π² массив.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ обновлСния Π² Π΄Π΅Π»Π΅Π³Π°Ρ‚Π΅ нашСго прилоТСния, Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ объяснСно Ρ€Π°Π½Π΅Π΅:


β€” (void) application:(UIApplication *)application

performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))

completionHandler{


BOOL haveNewContent = NO;

[self fetchNewsItems:&haveNewContent];


if (haveNewContent){

completionHandler(UIBackgroundFetchResultNewData);

} else {

completionHandler(UIBackgroundFetchResultNoData);

}


}


ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ. Π’ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅ нашСго Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° отслСТиваСм измСнСния массива новостных элСмСнтов Π² Π΄Π΅Π»Π΅Π³Π°Ρ‚Π΅ прилоТСния. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ содСрТимоС массива измСнится, ΠΌΡ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π²ΠΈΠ΄. Но Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ это с ΡƒΠΌΠΎΠΌ. Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слСдуСт ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π²ΠΈΠ΄. Но Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΎΡ‚Π»ΠΎΠΆΠΈΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π²ΠΈΠ΄ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ:


#import Β«TableViewController.hΒ»

#import Β«AppDelegate.hΒ»

#import Β«NewsItem.hΒ»


@interface TableViewController ()

@property (nonatomic, weak) NSArray *allNewsItems;

@property (nonatomic, unsafe_unretained) BOOL mustReloadView;

@end


@implementation TableViewController


β€” (void)viewDidLoad{

[super viewDidLoad];


AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

self.allNewsItems = appDelegate.allNewsItems;


[appDelegate addObserver: self

forKeyPath:@"allNewsItems"

options: NSKeyValueObservingOptionNew

context: NULL];


[[NSNotificationCenter defaultCenter]

addObserver: self

selector:@selector(handleAppIsBroughtToForeground:)

name: UIApplicationWillEnterForegroundNotification

object: nil];

}


β€” (void) observeValueForKeyPath:(NSString *)keyPath

ofObject:(id)object

change:(NSDictionary *)change

context:(void *)context{


if ([keyPath isEqualToString:@"allNewsItems"]){

if ([self isBeingPresented]){

[self.tableView reloadData];

} else {

self.mustReloadView = YES;

}

}

}


β€” (void) handleAppIsBroughtToForeground:(NSNotification *)paramNotification{

if (self.mustReloadView){

self.mustReloadView = NO;

[self.tableView reloadData];

}

}

НаконСц, потрСбуСтся Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ источника Π΄Π°Π½Π½Ρ‹Ρ… нашСго Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ элСмСнты Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π²ΠΈΠ΄:


β€” (NSInteger)tableView:(UITableView *)tableView

numberOfRowsInSection:(NSInteger)section{

return self.allNewsItems.count;

}


β€” (UITableViewCell *)tableView:(UITableView *)tableView

cellForRowAtIndexPath:(NSIndexPath *)indexPath{


static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView

dequeueReusableCellWithIdentifier: CellIdentifier

forIndexPath: indexPath];


NewsItem *newsItem = self.allNewsItems[indexPath.row];


cell.textLabel.text = newsItem.text;


return cell;

}


β€” (void) dealloc{

AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

[appDelegate removeObserver: self forKeyPath:@"allNewsItems"];

[[NSNotificationCenter defaultCenter] removeObserver: self];

}

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π° ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Ρ‚Π΅ ячСйки Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Cell. ΠœΠ΅Ρ‚ΠΎΠ΄ dequeueReusableCellWithIdentifier: forIndexPath: нашСго Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Π°Π»ΠΈΠ΄Π½Ρ‹Π΅ ячСйки, Π° Π½Π΅ nil, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ раскадровки ΠΌΡ‹ ΡƒΠΆΠ΅ Π·Π°Π΄Π°Π»ΠΈ этот ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ для ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ° ячСйки Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. Π’ΠΎ врСмя исполнСния раскадровка рСгистрируСт для iOS эту ячСйку-ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ячСйки ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, просто ΠΎΠΏΠΈΡ€Π°ΡΡΡŒ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΈ Π½Π΅ рСгистрируСм ячСйки Π·Π°Ρ€Π°Π½Π΅Π΅.

Π’Π°Π±Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²ΠΈΠ΄Ρ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрСны Π² Π³Π»Π°Π²Π΅ 4.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ запуститС вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ Home (Главная), Ρ‡Ρ‚ΠΎΠ±Ρ‹ пСрСвСсти вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ Π² Xcode ΠΈ Π² мСню Debug (ΠžΡ‚Π»Π°Π΄ΠΊΠ°) Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Simulate Background Fetch (Π˜ΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅) (рис. 14.2). Π’Π΅ΠΏΠ΅Ρ€ΡŒ вновь ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ Π΅Π³ΠΎ, ΠΈ посмотритС, появится Π»ΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚. Если Π½Π΅ появится β€” Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, Ρ‡Ρ‚ΠΎ запрограммированная Π½Π°ΠΌΠΈ Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΈΠ³Ρ€Ρƒ Π² орлянку. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ «опрСдСляСт», Π΅ΡΡ‚ΡŒ Π»ΠΈ Π½Π° «сСрвСрС» Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚. Π’Π°ΠΊ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²Ρ‹ сСрвСра. Если Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Β«Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°Β», просто ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΡŽ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ обновлСния Π² мСню Debug (ΠžΡ‚Π»Π°Π΄ΠΊΠ°), ΠΏΠΎΠΊΠ° «информация» Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Β«ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π°Β».


Рис. 14.2. Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ обновлСния Π² Xcode


Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»ΠΈ Π² систСмС iOS запросы Π½Π° Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΠΏΠΎΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Но Ρ‡Ρ‚ΠΎ, Ссли Ρ€Π°Π±ΠΎΡ‚Π° прилоТСния ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° ΠΈ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ сущСствуСт? Как Π½Π°ΠΌ ΡΡ‹ΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, сработаСт Π»ΠΈ наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°? ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, Apple ΡƒΠΆΠ΅ ΠΈ ΠΎΠ± этом ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΠ»Π°ΡΡŒ. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚ Manage Schemes (Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ схСмами) Π² мСню Product (ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚) Π² Xcode. Π—Π΄Π΅ΡΡŒ скопируйтС ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ схСму вашСго прилоТСния, Π½Π°ΠΆΠ°Π² ΠΊΠ½ΠΎΠΏΠΊΡƒ с плюсиком, Π° Π·Π°Ρ‚Π΅ΠΌ установив Ρ„Π»Π°ΠΆΠΎΠΊ Duplicate Scheme (Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ схСму) (рис. 14.3).


Рис. 14.3. Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ схСмы для обСспСчСния ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ обновлСния Π² ΠΏΠ΅Ρ€ΠΈΠΎΠ΄, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄Π°ΠΆΠ΅ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅


Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π²Π°ΠΌΠΈ откроСтся Π½ΠΎΠ²ΠΎΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅, ΠΊΠ°ΠΊ Π½Π° рис. 14.4. Π—Π΄Π΅ΡΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ свойства Π½ΠΎΠ²ΠΎΠΉ схСмы. Π’ этом Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ установитС Ρ„Π»Π°ΠΆΠΎΠΊ Launch due to a background fetch event (Запуск, обусловлСнный событиСм Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ обновлСния Π΄Π°Π½Π½Ρ‹Ρ…), Π° ΠΏΠΎΡ‚ΠΎΠΌ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ОК.


Рис. 14.4. Активизация схСмы для запуска прилоТСния с Ρ†Π΅Π»ΡŒΡŽ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ обновлСния


Π˜Ρ‚Π°ΠΊ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² Xcode записаны Π΄Π²Π΅ схСмы для прилоТСния (рис. 14.5). Π§Ρ‚ΠΎΠ±Ρ‹ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с Ρ†Π΅Π»ΡŒΡŽ Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ обновлСния, Π²Π°ΠΌ просто понадобится Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ Π²Ρ‚ΠΎΡ€ΡƒΡŽ схСму ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² симуляторС ΠΈΠ»ΠΈ Π½Π° устройствС. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ. ВмСсто этого Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π½ сигнал для обновлСния Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ application: performFetchWithCompletionHandler: Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° нашСго прилоТСния. Если Π²Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ всС шаги, описанныС Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅, Ρ‚ΠΎ Π² ΠΎΠ±ΠΎΠΈΡ… сцСнариях Ρƒ вас Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ работоспособноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: ΠΈ ΠΊΠΎΠ³Π΄Π° iOS Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ· Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°, ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ запускаСтся с нуля, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ обновлСния.