Hai tác vụ nền đồng thời cần vá hai mảng riêng biệt cần được hợp nhất trong khối dispatch_group_notify. Vấn đề là khối đầu tiên bị vượt quá nhưng dispatch_group_notify bị vượt quá mà không chờ đợi thực thi của tác vụ nền thứ hai. Sự khác biệt duy nhất giữa chúng là người đầu tiên thực hiện tìm kiếm địa phương và người thứ hai thực hiện cuộc gọi từ xa đến một dịch vụ web.Bất cứ lý do nào khiến người thứ hai nhảy qua?dispatch_group_notify không chờ đợi cho một dispatch_group_async
Chỉnh sửa: Tôi cũng đã thử cách tiếp cận được đề cập trong https://stackoverflow.com/a/19580584/859742 bằng dispatch_barrier_async nhưng vẫn giống nhau.
dispatch_group_t taskGroup = dispatch_group_create();
dispatch_queue_t mainQueue = dispatch_get_main_queue();
__block NSArray *localAddresses;
__block NSArray *remoteAddresses;
//Get local array in the background
dispatch_group_async(taskGroup, mainQueue, ^{
//localAddresses is set
});
//get remote array from server
dispatch_group_async(taskGroup, mainQueue, ^{
[[MDAddressManager instance] searchForPlacesContainingText:query
location:alocation
completion:^(NSArray* addresses, MDError *error){
//remoteAddresses is set
});
//Merge two arrays
dispatch_group_notify(taskGroup, mainQueue, ^{
//remoteAddresses and local addresses are merged
});
Và phương pháp tìm kiếm từ xa trông như thế này
- (void)searchForPlacesContainingText:(NSString *)searchText
location:(CLLocation *)alocation
completion:(MDAddressManagerBlock)completionBlock
{
NSDictionary *parameters = [[NSMutableDictionary alloc] init];
[parameters setValue:searchText forKey:@"input"];
[[MDHTTPClient sharedHTTPClient] getPath:@"v1/remotePlaces.json"
parameters:parameters
success:^(AFHTTPRequestOperation *operation, id dict) {
if ([MDHTTPClient isResponseValid:dict])
{
completionBlock(returnArray, nil);
}
else
{
completionBlock(nil, nil);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
EDLog(@"%@", error);
completionBlock(nil, [MDError errorAFNetworking:error]);
}];
}
cảm ơn bạn rất nhiều vì đã trả lời và giải thích tuyệt vời với các câu trả lời thay thế =) –
Tôi hav e đang tìm kiếm một thứ như thế này khá lâu. :) ngón tay cái lên. : D – riyaz
Bạn vẫn sử dụng dispatch_group_notify ở đây để được thông báo về việc hoàn thành nhóm? –