iOS — другой поток должен отправить reloadData в основной поток

#ios #multithreading #uitableview #uiview #reloaddata

#iOS #многопоточность #uitableview #uiview #reloaddata

Вопрос:

У меня есть отдельный поток, который создает объект UIView, вставляет его в источник данных UITableView, а затем вызывает reloadData в UITableView. Однако, поскольку это отдельный поток, он не может вызвать reloadData напрямую, ему нужно заставить mainthread сделать это… но как вы сообщите mainthread сделать это?

Спасибо

Ответ №1:

 [self.tableView performSelectorOnMainThread:@selector(reloadData)
                                 withObject:nil
                              waitUntilDone:NO];
 

Комментарии:

1. Я пришел сюда, чтобы скопировать эту строку 🙂 . Tq

Ответ №2:

Вы можете использовать асинхронную отправку, этот метод позволяет маршалировать рабочий поток к блокам встроенного кода, а не к методам, использующим performSelectorOnMainThread:

 dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableview reloadData];
});'
 

Ответ №3:

Как насчет чего-то подобного? (может не скомпилироваться, я его печатаю)

 - (void) callReloadData
{
    if ([NSThread isMainThread]) {
        @synchronized (self.tableView) {
            [self.tableView reloadData];
        }
    } else {
        [self performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
    }
}
 

Комментарии:

1. performSelectorOnMainThread: немедленно вызовет его селектор, если waitUntilDone: ДА, так что этот код бессмыслен. (Я тоже понятия не имею, почему вы решили поставить @synchronized блок.)