После некоторого наивного копирования в решении 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:
, так как он выполняет ту же цель, но вы также должны понимать, что происходит в большой картине. Кроме того, если вы делаете больше работы с пользовательским интерфейсом, а не просто перезагружаете таблицу, тогда весь этот код должен также поступать в основную очередь.
Ссылка: A concise example Использование GCD и управление фоном по сравнению с основной нитью.
Обычно метод reloadData обновляет представление tableview. Не могли бы вы поместить образец вашего кода TableViewController? –