2011-11-30 16 views
5
dispatch_queue_t callerQueue = dispatch_get_current_queue(); 
dispatch_retain(callerQueue); 
dispatch_queue_t downloadQueue = dispatch_queue_create("Download Queue",NULL); 

dispatch_async(downloadQueue, 
^{ 
    //some code that accesses a web service 
    dispatch_async(callerQueue, 
    ^{ 
     //some code that accesses UI 
    }); 
}); 
dispatch_release(downloadQueue); 
NSLog(@"great successing!"); 

Vấn đề là "Rất thành công!" không bao giờ xuất hiện và không có gì xảy ra ngoài phần cuối của mã ngoài cùng dispatch_async khối. Tôi không chắc mình đang làm gì sai nhưng tôi biết có điều gì đó nghiêm trọng sai trái với điều này.dispatch_async một hàng đợi tùy chỉnh không bao giờ thoát khối

+0

Cố gắng mã của bạn, và nó đang làm việc: http://pastie.org/2944762 –

+0

Thực vậy nó là ... Vì vậy, nó phải có để làm với hàng đợi tải xuống được phát hành sớm, nó mất một lúc để tải về tôi đoán. –

Trả lời

4

Bạn đang phát hành hàng đợi tải xuống quá sớm. Bạn cần đợi cho đến khi nó đã thực thi khối. dispatch_async man page đề xuất đưa bản phát hành vào cuối khối.

Điều quan trọng cần nhớ để giữ lại đợi đến trước khi cuộc gọi đầu tiên dispatch_async(), và để giải phóng hàng đợi rằng vào cuối gọi lại hoàn để đảm bảo hàng đợi đích không deallocated trong khi gọi lại hoàn đang chờ giải quyết.

2

Có một vài vấn đề với mã này:

  1. Bạn không cần phải giữ lại callerQueue sau khi tạo ra nó. Nó đã được tạo ra với số lượng giữ lại là 1 và có lẽ sẽ biến mất sau khi bạn phát hành nó sau này. Bằng cách giữ lại nó hai lần, bạn có khả năng tạo ra một rò rỉ.

  2. Bạn không bao giờ nên thực hiện thao tác giao diện người dùng trên bất kỳ hàng đợi nào ngoài hàng đợi chính (không phải là callerQueue trong trường hợp này).

Phần còn lại của các mã có vẻ tốt đẹp (và bạn không cần phải giải phóng hàng đợi tải về từ bên trong khối, như những người khác đang đề xuất, kể từ khi dispatch_async() gọi cũng sẽ giữ lại nó. Phải có nhiều hơn để đoạn mã này chúng tôi đang thiếu (như, không mã thoát ngay sau khi làm NSLog()?).

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