#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
блок.)