thể trùng lặp:
Grand Central Dispatch (GCD) vs. performSelector - need a better explanationThực hiện thay đổi giao diện người dùng trên chuỗi chính bằng dispatch_async hoặc performSelectorOnMainThread?
Để thực hiện "công cụ" về các chủ đề chính, tôi nên sử dụng dispatch_async
hoặc performSelectorOnMainThread
? Có cách nào ưu tiên, đúng hay sai, và/hoặc thực hành tốt nhất?
Ví dụ: Tôi đang thực hiện một số logic trong khối phương thức NSURLConnection sendAsynchronousRequest:urlRequest
. Bởi vì tôi đang làm công cụ cho chế độ xem chính như trình bày một UIAlertView
Tôi cần hiển thị số UIAlertView
trên chuỗi chính. Để làm điều này tôi đang sử dụng đoạn mã sau.
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
// code snipped out to keep this question short
if(![NSThread isMainThread])
{
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Oops!" message:@"Some Message" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
});
}
}];
Trong cùng tuyên bố if(![NSThread isMainThread])
Tôi cũng gọi một số phương thức tùy chỉnh. Câu hỏi là, tôi có nên sử dụng phương pháp dispatch_async
mà tôi đang sử dụng ở trên hay tốt hơn là sử dụng performSelectorOnMainThread
thay thế? Ví dụ, mã đầy đủ dưới đây:
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
// code snipped out to keep this question short
if(![NSThread isMainThread])
{
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Oops!" message:@"Some Message" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
// call custom methods in dispatch_async?
[self hideLoginSpinner];
});
// or call them here using performSelectorOnMainThread???
[self performSelectorOnMainThread:@selector(hideLoginSpinner) withObject:nil waitUntilDone:NO];
}
}];
FYI - Nếu tôi KHÔNG thực hiện các hành động trên, ông chủ đề chính tôi nhìn thấy một vài giây chậm trễ khi trình bày các UIAlertView
và tôi nhận được thông báo sau trong debugger wait_fences: failed to receive reply: 10004003
. Tôi đã học được rằng điều này là bởi vì bạn cần phải thực hiện thay đổi cho giao diện người dùng trên chủ đề chính ... Trong trường hợp ai đó đang tự hỏi tại sao tôi đang làm những gì tôi đang làm ...
liên quan chặt chẽ: [Sự khác nhau giữa performSelectorOnMainThread: và dispatch_async() trên hàng đợi chính là gì?] (Http://stackoverflow.com/questions/9335434/) –
Sự khác biệt rõ ràng nhất từ POV của _writing_ mã là việc gửi một khối là linh hoạt hơn: đó là cách dễ dàng hơn để xử lý các đối số nguyên thủy, chẳng hạn. –