Несколько наивно скопировав решение yonel и назвав его хорошим, я понял, что вызов 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]
});
});
Если единственное, что вам нужно сделать, это позвонить [self.tableView reloadData]
, вероятно, можно использовать performSelectorOnMainThread:withObject:waitUntilDone:
, поскольку он выполняет ту же задачу, но вы также должны понимать, что происходит в общей картине. Кроме того, если вы выполняете больше работы с пользовательским интерфейсом, чем просто перезагружаете таблицу, весь этот код также должен идти в основную очередь.
Ссылка: Краткий пример использования GCD и управления фоновым потоком по сравнению с основным потоком.
person
Kyle Clegg
schedule
05.03.2014