Ilk*_*aci 8 queue asynchronous grand-central-dispatch ios objective-c-blocks
两个并发后台任务需要修补两个需要在dispatch_group_notify块中合并的独立阵列.问题在于,超出了第一个块但超出了dispatch_group_notify,而没有等待执行第二个后台任务.它们之间唯一不同的是,第一个进行本地搜索,第二个远程调用Web服务.任何线索为什么第二个跳过?
编辑:我也尝试使用dispatch_barrier_async 在/sf/answers/1370640911/中提到的方法,但仍然相同.
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
});
Run Code Online (Sandbox Code Playgroud)
而远程搜索方法看起来像这样
- (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]);
}];
}
Run Code Online (Sandbox Code Playgroud)
Rob*_*Rob 14
这是因为您的getPath
方法异步运行.在完成块运行之前,您需要它不离开组.所以,而不是做dispatch_group_async
,你应该手动dispatch_group_enter
和dispatch_group_leave
.
您可以从以下位置更改代码:
dispatch_group_async(taskGroup, mainQueue, ^{
[[MDAddressManager instance] searchForPlacesContainingText:query
location:alocation
completion:^(NSArray* addresses, MDError *error){
//remoteAddresses is set
}];
});
Run Code Online (Sandbox Code Playgroud)
至:
dispatch_group_enter(taskGroup);
[[MDAddressManager instance] searchForPlacesContainingText:query
location:alocation
completion:^(NSArray* addresses, MDError *error){
//remoteAddresses is set
dispatch_group_leave(taskGroup);
});
Run Code Online (Sandbox Code Playgroud)
这将确保您在调用完成块之前不离开组.
或者,您可以更改searchForPlacesContainingText
为使用dispatch_group_t
参数:
- (void)searchForPlacesContainingText:(NSString *)searchText
location:(CLLocation *)alocation
group:(dispatch_group_t)group
completion:(MDAddressManagerBlock)completionBlock
{
dispatch_group_enter(group);
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);
}
dispatch_group_leave(group);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
EDLog(@"%@", error);
completionBlock(nil, [MDError errorAFNetworking:error]);
dispatch_group_leave(group);
}];
}
Run Code Online (Sandbox Code Playgroud)
并更改您的调用,以便它不会dispatch_group_async
,但只是传递taskGroup
参数:
[[MDAddressManager instance] searchForPlacesContainingText:query
location:alocation
group:taskGroup
completion:^(NSArray* addresses, MDError *error) {
//remoteAddresses is set
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5914 次 |
最近记录: |