2012-05-08 19 views
7

Giả sử tôi có hàng đợi công văn nối tiếp và tôi enqueue một số hoạt động trên đó. Tôi đã đọc rằng tôi không thể hủy hoạt động khi chúng được gửi đi. Có thể ít nhất là xem những gì khối GCD tôi đã gửi đến có thể đưa ra quyết định nếu tôi muốn gửi một số khác?Kiểm tra khối GCD enqueued?

Ví dụ, tôi gửi Thao tác A đến hàng đợi nhưng ngay sau khi ứng dụng của tôi quyết định enqueue hoạt động A khác, vì vậy bây giờ có 2 trong số các hoạt động này được xếp hàng đợi.

+1

Bạn có thể giải thích về những gì bạn đang cố gắng làm không? Có một số giải pháp dựa trên mục tiêu thực tế của bạn. –

Trả lời

0

Kể từ NSOperation nay được xây dựng trên đầu trang của GCD, bây giờ bạn có thể sử dụng addOperationWithBlock: để đặt khối của bạn trên một NSOperationQueue, sau đó bạn có thể gọi hoạt động trên NSOperationQueue để có được một NSArray hoạt động chưa hoàn thành. Vấn đề với điều này, là đây là nhiều hơn hai hoạt động và không phải là nguyên tử, do đó, nó hoàn toàn có thể là hoạt động của bạn sẽ kết thúc vào khoảng thời gian bạn nhận được hoạt động mảng và xem nó có chứa ở đó hay không.

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html

NSOperations có một API điều kiện tiên quyết, tuy nhiên, vì vậy bạn có thể enqueue một hoạt động mà sẽ chỉ chạy nếu NSOperation đầu tiên bạn kết thúc, và sử dụng nó để theo dõi khi nào bạn nên cố gắng enqueue NSOperation đầu tiên của bạn một lần nữa .

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html#//apple_ref/doc/uid/TP40004591

2

Như Kevin Ballard đã nói, bạn cần phải giải thích chính xác bạn đang cố gắng làm gì. Một điều bạn có thể làm là thiết lập một lá cờ, như valid_ và sau đó bạn có hiệu quả có thể hủy bỏ tất cả nhưng mục hiện tại trong hàng đợi bằng cách làm một cái gì đó như thế này:

dispatch_async(queue, ^{ 
    if (valid_) { 
    // perform your task here 
    } 
}); 

Sau đó, bất cứ khi nào bạn muốn "hủy bỏ" hàng đợi, chỉ cần đặt cờ valid_ của bạn thành NO.

Một lần nữa, hãy cung cấp thêm thông tin về những gì bạn đang cố gắng làm và tôi có thể cung cấp cho bạn câu trả lời tốt hơn.

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