Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

[_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{

Поделиться:
Популярные книги

Сильнейший ученик. Том 2

Ткачев Андрей Юрьевич
2. Пробуждение крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сильнейший ученик. Том 2

Кодекс Охотника. Книга XXIII

Винокуров Юрий
23. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXIII

Скрытые чувства

Эльденберт Марина
Любовные романы:
любовно-фантастические романы
7.17
рейтинг книги
Скрытые чувства

Газлайтер. Том 3

Володин Григорий
3. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 3

Мастер 4

Чащин Валерий
4. Мастер
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Мастер 4

Хозяин Стужи 7

Петров Максим Николаевич
7. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 7

Неведомые поля (сборник)

Бигл Питер Сойер
Шедевры фантастики
Фантастика:
фэнтези
6.60
рейтинг книги
Неведомые поля (сборник)

Черный Маг Императора 12

Герда Александр
12. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 12

Геном хищника. Книга седьмая

Гарцевич Евгений Александрович
7. Я - Легенда!
Фантастика:
боевая фантастика
рпг
фэнтези
попаданцы
5.00
рейтинг книги
Геном хищника. Книга седьмая

Вампир. Английская готика. XIX век

Стивенсон Роберт Льюис
Фантастика:
ужасы и мистика
7.67
рейтинг книги
Вампир. Английская готика. XIX век

На границе империй. Том 7. Часть 5

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Запечатанный во тьме. Том 3

NikL
3. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 3

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6