Как использовать данные наблюдений в моем tableView? - PullRequest
0 голосов
/ 09 октября 2019

Я наблюдал данные, которые занимают некоторое время для заполнения контактов:

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?

...