5

Tôi đã xem đoạn mã này và tôi không thể hiểu tại sao tác giả đã làm điều này. Hãy xem mã này:Có phải dispatch_async (dispatch_get_main_queue(), ...) cần thiết trong trường hợp này không?

someMethodStandardMethodUsingABlock:^() { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil]; 
    }); 
}]; 

Tôi có phương thức có khối hoàn thành và trong thông báo chặn này phải được đăng. Tôi không hiểu lý do tại sao các dispatch_async trên hàng đợi chính là cần thiết trong trường hợp này. Khối sẽ được chạy trên chủ đề chính, và thậm chí nếu nó không phải là tôi không nghĩ rằng nó sẽ thực sự quan trọng phải không? Tôi chỉ đơn giản là đã viết điều này:

someMethodStandardMethodUsingABlock:^() { 
    [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil]; 
}]; 

Và nó hoạt động trong thử nghiệm của tôi.

Nếu bạn có thể giúp tôi làm sáng tỏ điều này, tôi thực sự đánh giá cao điều đó!

Matt

Trả lời

9

Những câu 2 từ NSNotificationCenter Lớp tham khảo gợi ý một vài lý do có thể:

Một trung tâm thông báo cung cấp thông báo tới các nhà quan sát cách đồng bộ. Nói cách khác, các phương thức postNotification: không trả lại cho cho đến khi tất cả các nhà quan sát đã nhận và xử lý thông báo .

...

Trong một ứng dụng đa luồng, thông báo luôn giao trong thread trong đó thông báo đã được đăng, mà có thể không được như vậy chủ đề trong đó một người quan sát đăng ký chính nó.

Vì vậy, có thể (a) tác giả không muốn mã chặn cho đến khi tất cả người quan sát xử lý thông báo và/hoặc (b) anh ta muốn đảm bảo rằng các phương pháp quan sát chạy trên luồng chính.

+0

Cảm ơn David, b dường như phù hợp với trường hợp của tôi. Các tài liệu dường như không chỉ định, nhưng có vấn đề gì nếu thông báo được gửi trên một luồng khác mà một người quan sát đã đăng ký? Điều này có nghĩa là người quan sát vẫn đang truy cập – MGA

+0

Có, người quan sát sẽ vẫn nhận được thông báo ngay cả khi thông báo được gửi trên một chủ đề khác. –

0

Đôi khi bạn cần chạy các phương pháp kích hoạt thực hiện không đồng bộ và quay lại ngay lập tức. Ví dụ. một số phương pháp của AppDelegate 'khóa' như applicationDidBecomeActive hoặc applicationDidEnterBackground, cần phải được thực hiện và trả lại nhanh chóng để hệ điều hành không giết ứng dụng của bạn.

Tôi không biết nếu đó là trường hợp của câu hỏi của bạn, nhưng nó là một lời giải thích có thể có về việc sử dụng dispatch_async.

Các vấn đề liên quan