Я наблюдал данные, которые занимают некоторое время для заполнения контактов:
NSNotificationCenter *notification = [NSNotificationCenter defaultCenter];
[notification addObserver:self selector:@selector(tableView: cellForRowAtIndexPath:) name:@"refreshContactList" object:nil];
-(void)contactsCallback {
contacts = [[[InternalContactsHandler sharedBuffer] contacts] sortedArrayUsingSelector:NSSelectorFromString(@"nameOfContactCompare:")];
}
Это прекрасно работает, но как мне на самом деле использовать contacts
array
в моем tableView
? cellForRowAtIndexPath
срабатывает еще до viewWillAppear
, поэтому, когда мой observer
заполнил, мой array
cellForRowAtIndexPath
уже завершен.
Я попытался использовать completion handler
, но думаю, что я могу неправильно понять, как этодолжен работать:
В cellForRowAtIndexPath
я запускаю функцию с callback
с данными, которые будут использоваться для cell
:
[self getContactsData:^ {
//Just to see if it worked
NSLog(@"?%lu Contacts CallBack", (unsigned long)[[[InternalContactsHandler sharedBuffer] contacts] count]);
}];
И функцией:
-(void)getContactsData:(void(^)(void))callback {
NSNotificationCenter *notification = [NSNotificationCenter defaultCenter];
[notification addObserver:self selector:@selector(contactsCallback) name:@"refreshContactList" object:nil];
callback();
}
Теперь в моем мире callback
должен сработать после того, как observer
завершит заполнение contacts
, но, очевидно, это не сработает. callback()
срабатывает, пока observer
все еще ожидает изменений, поэтому в cellForRowAtIndexPath
contacts
равно 0 и выполняется до завершения observer
, в то время как observer
завершается после callback
.
Итак, как мне перенести заполненные данные contacts
в cellForRowAtIndexPath
?