После некоторого наивного копирования решения Йонеля и признания его хорошим, я понял, что вызов performSelectorOnMainThread:withObject:waitUntilDone:
исправил симптом, но не проблему. Большая проблема заключается в том, что вы делаете обновления пользовательского интерфейса, находясь в контексте асинхронного или фонового потока.
Вот как выглядел мой код:
dispatch_queue_t queue = dispatch_queue_create("com.kyleclegg.myqueue", NULL);
dispatch_async(queue, ^{
// Make API call
// Retrieve data, parse JSON, update local properties
// Make a call to reload table data
});
Когда это должно выглядеть так:
dispatch_queue_t queue = dispatch_queue_create("com.kyleclegg.myqueue", NULL);
dispatch_async(queue, ^{
// Make API call
// Retrieve data, parse JSON, update local properties
dispatch_async(dispatch_get_main_queue(), ^{
// Now make the call to reload data and make any other UI updates
[self.tableView reloadData]
});
});
Если вам нужно only , это позвонить по номеру [self.tableView reloadData]
, вероятно, будет хорошо использовать performSelectorOnMainThread:withObject:waitUntilDone:
, поскольку он выполняет ту же цель, но вы также должны понимать, что происходит в целом. Кроме того, если вы выполняете больше работы с пользовательским интерфейсом, чем просто перезагружаете таблицу, тогда весь этот код также должен попадать в основную очередь.
Ссылка: Краткий пример использования GCD и управления фоном и основным потоком.