2012-05-11 26 views
16

Mã sau có chạy trên luồng chính không? "Hàng đợi chính" có đề cập đến chủ đề chính không?Việc sử dụng dispatch_get_main_queue() có nghĩa là mã của tôi sẽ nằm trên chuỗi chính không?

dispatch_async(dispatch_get_main_queue(), 
^{ 
    // Some code 
}); 
+0

Lưu ý rằng nếu bạn tình cờ làm điều đó và ** BẠN ĐANG CÓ THẬT ** trên chuỗi chính, trên thực tế nó là ** QUITE HARMLESS **. Điều này rất thuận tiện khi bạn có mã mạng phức tạp! :) – Fattie

Trả lời

27

Phần không đồng bộ của công văn async vs sync khác với đồng thời so với nối tiếp. Async có nghĩa là hàm trả về ngay lập tức, đồng bộ có nghĩa là nó sẽ đợi cho đến khi khối được thực hiện. Vì chuỗi/hàng đợi chính được nối tiếp, mọi thứ sẽ được thực hiện theo thứ tự - tôi tin rằng điều này có nghĩa là vì bạn đang yêu cầu gửi đồng bộ hóa trên cùng một chuỗi mà bạn gửi đi, nó sẽ trả về ngay lập tức, đợi cho đến khi kết thúc vòng lặp chạy hiện tại và bất kỳ thứ gì khác trong hàng đợi, và sau đó thực thi khối của bạn. Điều này hữu ích hơn trong hàng đợi hơn là trên chuỗi chính - bạn có thể xử lý dữ liệu của mình, để giao diện người dùng biết cập nhật và tiếp tục xử lý mà không cần chờ mọi thứ vẽ lại, v.v. Đó là lý do bạn sẽ thường thấy một cuộc gọi dispatch_async đến luồng chính bên trong một dispatch_async khác (hàng đợi đồng thời) thay vì chỉ một dispatch_sync.

24

Có. Từ Apple developer site:

Khung công tác cung cấp hàng đợi nối tiếp mặc định cho ứng dụng để sử dụng. Hàng đợi này được truy cập qua dispatch_get_main_queue().

+1

Nó được đảm bảo để chạy trên thread chính chỉ khi có một vòng lặp chạy liên quan đến chủ đề chính. – CouchDeveloper

8

Tài liệu này được ghi ở nhiều nơi, bao gồm docs for dispatch_get_main_queue() itself. Số điện thoại Concurrency Programming Guide cho biết:

Hàng đợi chính là hàng đợi có sẵn trên toàn cầu thực hiện các tác vụ trên chuỗi chính của ứng dụng.

+2

Không hoàn toàn chính xác: Nó được đảm bảo để chạy trên thread chính chỉ khi có một vòng lặp chạy liên quan đến chủ đề chính. Nếu không, khối được gửi qua 'dispatch_async (dispatch_get_main_queue(), block)' có thể thực hiện trên bất kỳ luồng nào. – CouchDeveloper

+1

Chủ đề chính luôn có vòng lặp chạy trong ứng dụng Cocoa, @CouchDeveloper. –

+0

@JoshCaswell OP không đề cập đến ca cao;) – CouchDeveloper