Điều này có vẻ như nó thực sự đơn giản nhưng tôi gặp rất nhiều rắc rối. Tôi có một chức năng kích hoạt một loạt các chức năng khác chạy trong nền và có các khối hoàn thành. Tôi muốn chức năng của tôi đợi cho đến khi tất cả các khối hoàn thành được gọi trước khi nó trả về.iOS: Không trở về từ chức năng cho đến khi nhiều chủ đề nền hoàn thành
Tôi không có quyền kiểm soát chức năng tôi đang gọi thực hiện trong nền. Nếu không, tôi sẽ sửa đổi nó để sử dụng dispatch_async với hàng đợi của riêng tôi và sau đó chờ đợi trên hàng đợi đó để kết thúc.
Ví dụ về những gì hoàn cảnh của tôi trông giống như:
- (void)functionThatShouldBeSynchronous {
for (int i = 0; i < 10; i++) {
[self doSomethingInBackground:^{
NSLog(@"completed!");
}];
}
// How do I wait until all 10 threads have completed before returning?
}
- (void)doSomethingInBackground:(void(^)())completion {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[NSThread sleepForTimeInterval:1.0f]; // Do stuff
completion(); // Execute completion block
});
}
Cảm ơn trước.
Bất kể bạn kết thúc làm gì, ** cũng không chặn luồng chính **. – bbum
@bbum chỉ vì tò mò, hậu quả tiềm ẩn của việc này là gì? –
Tốt nhất? Khả năng phản hồi kém và hoạt ảnh không tốt. Lúc tồi tệ nhất? Nếu bạn chặn luồng chính đủ lâu, hệ thống sẽ giết ứng dụng của bạn với giả định rằng nó bị khóa. – bbum