2017-12-05 20 views
5

Tôi đã thừa hưởng một số mã có chuỗi lồng nhau không bình thường này. Mô hình thông thường sẽ có một công văn duy nhất đến hàng đợi chính để cập nhật giao diện người dùng. Mã, được hiển thị bên dưới, tổ chức một công văn đến hàng đợi chính trong một công văn khác đến hàng đợi chính.Mục đích của nesting dispatch_async (dispatch_get_main_queue()^{}) là gì?

- (void)viewDidLoad 
{ 
// Setup some data 
// Adjust UI 

dispatch_async(myBackgroundQueue, ^{ 
    while(Do_some_time_consuming_work) { 

    // Time consuming work goes here 

    if (things_are_going_slowly) { 

     dispatch_async(dispatch_get_main_queue(), ^{ // <- one of these two seems redundant 
      dispatch_async(dispatch_get_main_queue(), ^{ // <- one of these two seems redundant 

      stillWorkingLabel.hidden = NO; //Let user know the work is still ongoing 
      }); 
     }); 
    ) 

    // Finish time-consuming work 
    } 

    }); 

} 

Mục đích, nếu có, làm tổ dispatch_async(dispatch_get_main_queue() là gì? Chuỗi lồng nhau này hiển thị ở một số vị trí trong ứng dụng. Dường như với tôi rằng chỉ có một công văn đến hàng đợi chính là cần thiết.

Tôi nghĩ tôi đã đọc tất cả các câu hỏi liên quan về các chủ đề liên quan tại đây và thông qua tìm kiếm của Google, nhưng tôi chưa tìm thấy ai đề xuất lồng hai công văn giống hệt nhau.

Ứng dụng hoạt động tốt, với giao diện người dùng cập nhật như mong đợi trong ví dụ trên và ở những nơi khác trong mã.

Hầu hết mã của ứng dụng sử dụng phiên bản không lồng nhau thông thường của sơ đồ trên và dĩ nhiên nó cũng hoạt động tốt.

Tôi có xu hướng chỉ thay thế các cuộc gọi lồng nhau này bằng một công văn duy nhất, nhưng có thể tôi đang thiếu thứ gì đó ở đây. Lời khuyên nào sẽ được đánh giá cao.

Trả lời

2

Tôi không thể nghĩ ra một lợi thế nào để thực hiện việc này và có thể nghĩ ra lý do không. Nó sẽ trì hoãn việc thực hiện đóng cửa bên trong, cũng như lấy một lượng nhỏ tài nguyên bổ sung. (Nó sẽ buộc ứng dụng phải trải qua ít nhất 2 thông qua vòng lặp sự kiện trước khi mục công việc được thực thi.)

Tôi nghĩ rằng việc loại bỏ các cuộc gọi lồng nhau là điều đúng đắn cần làm.

0

Làm tổ hai dispatch_queues cho chính không thực hiện bất kỳ nghĩa nào đó, con đường thẳng về phía trước là

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

// perform long task here 

dispatch_async(dispatch_get_main_queue(), ^(){ 

    //Add method, task you want perform on mainQueue 
//Control UIView, IBOutlet all here 

}); });