6

Có cách nào để tôi có thể thực hiện một khối thay vì bộ chọn tương ứng với phương thức này và các phương thức tương tự không?Chặn phiên bản performSelectorOnMainThread: withObject: waitUntilDone:

Tôi có các nhà quan sát có thể nhận các sự kiện không được tạo trên luồng chính. Tôi muốn hành động được thực hiện trên luồng chính nếu chủ yếu là định hướng giao diện người dùng. Ngay bây giờ, tôi cần phải viết hai phương thức để làm điều này, trong đó một là trình quan sát sự kiện và thứ hai là mã cần được thực thi trên luồng chính.

Tôi muốn đóng gói tất cả thành một phương pháp, nếu có thể.

Trả lời

11

Công nghệ thích hợp hơn cho các hành động đa luồng hỗ trợ chặn được gọi là Công văn Grand Central. Bạn có thể tìm thấy một số mẫu mã trên Wikipedia và trong Grand Central Dispatch (GCD) Reference

dispatch_async(backgroundQueue, ^{ 
     //background tasks 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      //tasks on main thread 
     });  
}); 
+1

Dường như hai giá trị này không tương đương theo [câu hỏi SO này] (http://stackoverflow.com/questions/9335434/whats-the-difference-between-performselectoronmainthread-and-dispatch-async-on-m). Ngoài ra [this] (http://stackoverflow.com/questions/19544207/how-to-avoid-coreanimation-warning-deleted-thread-with-uncommitted-catransactio) cho một câu trả lời cụ thể hơn cho UI. – insys

13

GCD nên làm các trick:

dispatch_sync(dispatch_get_main_queue(), ^{ 
    // Do stuff here 
}); 

Hoặc dispatch_async nếu bạn đang lên kế hoạch trên waitUntilDone:NO. Các main queue is guaranteed để chạy trên thread chính, vì vậy nó là an toàn cho hoạt động giao diện người dùng.

+0

Tôi thề Tôi đã trả lời này trước đây, nhưng tôi không thể tìm thấy trùng lặp./Tôi nhún vai –

+0

Cảm ơn câu trả lời nhanh, Josh. Đây là câu trả lời tôi đã thấy, mà tôi sẽ thực hiện. Vì cả hai câu trả lời đều được gắn thẻ cùng một lúc, tôi sẽ cung cấp cho Fscheidl kiểm tra màu xanh lá cây và cho bạn phiếu bầu. Tôi hy vọng bạn không nhớ. – Jim

+2

Vui vì tôi có thể giúp. Tôi có nhiều đại diện hơn tôi biết phải làm gì với, vì vậy không, nó không quan trọng, cảm ơn. –

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