2012-05-03 42 views
21

Tôi đang cố gắng hai phương pháp sau đây:Thực hiện trên vòng lặp chạy tiếp theo: Có gì sai với GCD?

dispatch_async(dispatch_get_main_queue(),^{ 
    [self handleClickAsync]; 
}); 

[self performSelector:@selector(handleClickAsync) withObject:nil afterDelay:0]; 

để đáp ứng với một nút bấm.

Điều thứ hai cho phép UIButton làm nổi bật như mong đợi và thực hiện handleClickAsync trên vòng lặp chạy tiếp theo (tôi giả sử: "đôi khi sau đó" để chắc chắn). Đầu tiên không cho phép cá thể UIButton sáng lên cho đến khi thao tác hoàn tất.

Cách chính xác để làm điều này với GCD, hoặc là performSelector vẫn là cách duy nhất?

+0

Có lẽ bạn đang gọi điện thoại này từ bên trong một hàng đợi công văn? Nếu có, nó sẽ chạy tất cả các lệnh tuần tự trong hàng đợi. Bạn có thể gọi phương thức này trước khi bắt đầu hoạt động không? –

+0

Tôi không chắc chắn. Tôi gọi nó trực tiếp từ một 'touchesEnded', nó xuất hiện miễn phí trên lớp con' UIView' (hoặc UIButton trong trường hợp này). –

+0

Tôi không chắc chắn lý do tại sao bạn đang thực hiện một hiệp hội giữa dispatch_async và chạy runloop ... –

Trả lời

36

Tôi tin rằng câu trả lời được tìm thấy ở đây trong một discussion of the main dispatch queue:

hàng đợi này làm việc với vòng chạy của ứng dụng (nếu có mặt) để interleave việc thực hiện các nhiệm vụ xếp hàng đợi với việc thực hiện các nguồn sự kiện khác kèm theo đến vòng lặp chạy.

Nói cách khác, hàng đợi công văn chính thiết lập một hàng đợi trung học (cùng với hàng đợi sự kiện tiêu chuẩn được cung cấp bởi UIApplicationMain() để xử lý khối nộp cho hàng đợi chính. Khi khối có mặt trong hàng đợi, vòng lặp chạy sẽ nhiệm vụ dequeuing thay thế từ hàng đợi sự kiện chính và hàng đợi công văn Mặt khác, reference cho delay tham số của -performSelector:withObject:afterDelay: ghi chú rằng:.

Xác định một sự chậm trễ từ 0 không nhất thiết gây ra selector được thực hiện ngay lập tức Bộ chọn vẫn được xếp hàng đợi trên chuỗi ' s chạy vòng lặp và thực hiện càng sớm càng tốt.

Do đó, khi bạn sử dụng bộ chọn thực hiện, thao tác sẽ được xếp hàng ở cuối hàng đợi sự kiện chính và sẽ không được thực hiện cho đến sau mọi thứ trước hàng đợi đó (có thể bao gồm mã để làm mờ ánh sáng UIButton) đã được xử lý. Tuy nhiên, khi bạn sử dụng hàng đợi công văn, nó sẽ thêm khối vào hàng đợi phụ mà sau đó có thể được xử lý ngay lập tức (tức là, trên vòng lặp tiếp theo) giả sử không có khối nào khác trong hàng đợi chính. Trong trường hợp này, mã để unhighlight nút vẫn còn ngồi trong hàng đợi sự kiện chính trong khi chạy vòng lặp xử lý sự kiện từ hàng đợi khối thứ cấp.

+0

Điều này có ý nghĩa, Sean, và dường như giải thích thực tế thực nghiệm. Tôi sẽ chờ một vài ngày để đánh dấu điều này được chấp nhận để xem những loại câu trả lời khác. –

+0

Hmmm ... hy vọng ai đó như @ bbum sẽ đến và xác minh công cụ này, nhưng đó không phải là cách SO hoạt động, vì vậy tôi sẽ đánh dấu đây là câu trả lời tốt nhất tạm thời (mãi mãi). Cảm ơn một lần nữa. –

22

Tôi nghĩ rằng điều này sẽ phá vỡ đáy của bạn:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
    //bla bla bla 
}]; 
+0

Nó đã làm cho tôi. :) –

+0

Có. Điều này đang hoạt động! – Klaas

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