Arial Century Courier Georgia Tahoma Verdana Times New Roman
-
+
[_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{