2012-03-09 26 views
9

Tôi cần gửi nhiều nhiệm vụ đến Grand Central Dispatch để chạy. Một số nhiệm vụ sẽ hoàn thành trước, trong khi một số nhiệm vụ sẽ kết thúc sau cùng.Làm cách nào để biết tất cả các nhiệm vụ của tôi tại Grand Central Dispatch đã hoàn thành?

Làm cách nào để biết tất cả công việc của tôi trong Grand Central Dispatch đã hoàn tất?

Tôi có nên sử dụng bộ đếm để ghi lại số lượng công việc đã hoàn thành không? Bất kỳ phương pháp thông minh hơn?

Trả lời

22

Bạn có thể sử dụng nhóm công văn để được thông báo khi tất cả công việc đã hoàn tất. Đây là một ví dụ từ http://cocoasamurai.blogspot.com/2009/09/guide-to-blocks-grand-central-dispatch.html

dispatch_queue_t queue = dispatch_get_global_queue(0,0); 
dispatch_group_t group = dispatch_group_create(); 

dispatch_group_async(group,queue,^{ 
    NSLog(@"Block 1"); 
}); 

dispatch_group_async(group,queue,^{ 
    NSLog(@"Block 2"); 
}); 

dispatch_group_notify(group,queue,^{ 
    NSLog(@"Final block is executed last after 1 and 2"); 
}); 
+0

Cảm ơn. IOS có hỗ trợ tính năng này không? – user403015

+0

Hướng dẫn dành cho nhà phát triển "Có sẵn trong iOS 4.0 trở lên". (https://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html#//apple_ref/doc/uid/TP40008079) –

+0

Cảm ơn bạn rất nhiều. – user403015

3

Nếu bạn muốn kiểm soát một nhiệm vụ để thực hiện ở cuối, bạn có thể sử dụng dispatch_group_t, Nếu bạn muốn một công việc không chỉ để thực hiện sau khi một số nhiệm vụ mà còn để thực hiện trước khi một số nhiệm vụ , bạn có thể sử dụng dispatch_barrier_sync:

dispatch_queue_t queue = dispatch_queue_create("com.example.gcd", DISPATCH_QUEUE_CONCURRENT); 

dispatch_async(queue, ^{ printf("1");}); 

dispatch_async(queue, ^{ printf("2");}); 

dispatch_barrier_sync(queue, ^{ printf("3");}); 

dispatch_async(queue, ^{ printf("4");}); 

dispatch_async(queue, ^{ printf("5");}); 

nó có thể in

12345 or 21354 or ... but 3 always after 1 and 2, and 3 always before 4 and 5 

Nếu muốn của bạn để kiểm soát trình tự chính xác, bạn có thể sử dụng dispatch_sync hoặc serial Dispat ch Queue, hoặc NSOperationQueue.If bạn sử dụng NSOperationQueue, sử dụng phương pháp "addDependency" để kiểm soát thứ tự của nhiệm vụ:

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"op 1"); 
}]; 

NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"op 2"); 
}]; 

NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"op 3"); 
}]; 

//op3 is executed last after op2,op2 after op1  
[op2 addDependency:op1]; 
[op3 addDependency:op2]; 

[queue addOperation:op1]; 
[queue addOperation:op2]; 
[[NSOperationQueue mainQueue] addOperation:op3]; 

Nó sẽ luôn in:

op1 op2 op3 
1

Bạn có thể đạt được điều này bằng GCD sử dụng DispatchGroup trong swift 3. Bạn có thể nhận được thông báo khi tất cả các tác vụ được hoàn tất.

let group = DispatchGroup() 

    group.enter() 
    run(after: 6) { 
     print(" 6 seconds") 
     group.leave() 
    } 

    group.enter() 
    run(after: 4) { 
     print(" 4 seconds") 
     group.leave() 
    } 

    group.enter() 
    run(after: 2) { 
     print(" 2 seconds") 
     group.leave() 
    } 

    group.enter() 
    run(after: 1) { 
     print(" 1 second") 
     group.leave() 
    } 


    group.notify(queue: DispatchQueue.global(qos: .background)) { 
     print("All async calls completed") 
} 
Các vấn đề liên quan