#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 Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ· ΡΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°, ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Ρ Π½ΡΠ»Ρ, ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ.