Po pewnym naiwnym skopiowaniu rozwiązania Yonela i nazwaniu go dobrym, zdałem sobie sprawę, że wywołanie performSelectorOnMainThread:withObject:waitUntilDone:
naprawiło symptom, ale nie problem. Większy problem polega na tym, że robisz aktualizacje UI, gdy wciąż jesteś w kontekście wątku asynchronicznego lub tła.
To właśnie mój kod wyglądało:
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
});
Kiedy powinno to wyglądać tak:
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]
});
});
Jeśli tylko rzeczą, którą musisz zrobić to zadzwonić [self.tableView reloadData]
to chyba dobrze, aby użyj performSelectorOnMainThread:withObject:waitUntilDone:
, ponieważ osiąga ten sam cel, ale powinieneś także rozpoznać, co dzieje się na dużym obrazie. Także, jeśli robisz więcej pracy z UI niż tylko ponowne ładowanie tabeli, to cały ten kod powinien również iść do głównej kolejki.
Odniesienie: A concise example korzystania z GCD i zarządzania tłem a głównym wątkiem.
Zwykle metoda reloadData odświeża widok tableview. Czy możesz umieścić próbkę swojego kodu TableViewController? –