Sau khi sao chép một cách ngây thơ một cách ngây thơ trong giải pháp của yonel và gọi nó là tốt, tôi nhận ra rằng gọi performSelectorOnMainThread:withObject:waitUntilDone:
cố định các triệu chứng, nhưng không phải là vấn đề. Vấn đề lớn hơn là bạn đang thực hiện cập nhật giao diện người dùng trong khi vẫn còn trong ngữ cảnh của chuỗi không đồng bộ hoặc nền.
Đây là những gì mã của tôi trông giống như:
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
});
Khi nó sẽ giống như thế này:
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]
});
});
Nếu điều chỉ bạn cần phải làm là gọi [self.tableView reloadData]
nó có thể là tốt để sử dụng performSelectorOnMainThread:withObject:waitUntilDone:
vì nó hoàn thành cùng một mục tiêu, nhưng bạn cũng nên nhận ra những gì đang xảy ra trong bức tranh lớn. Ngoài ra, nếu bạn đang làm nhiều công việc giao diện người dùng hơn là tải lại bảng thì tất cả mã đó cũng sẽ nằm trên hàng đợi chính.
Tham chiếu: A concise example sử dụng GCD và quản lý nền so với chuỗi chính.
Nguồn
2014-03-05 23:44:57
Thông thường, phương thức reloadData làm mới chế độ xem của chế độ xem bảng. Bạn có thể đặt mẫu mã TableViewController của bạn? –