我这里有一大块代码,基本上调用我的servlet(它做了),然后返回结果。但是,如果我添加了同步/阻止部分(请参阅if(isSync)
),则不会调用完成块,整个应用程序会在dispatch_group_wait
中挂起。如果它有任何不同,则从主线程调用此代码。
// ...More code here
if(isSync)
{
dispatch_group_enter(group);
}
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:REQ];
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *result = responseObject;
NSLog(@"JSON responseObject: %@ ", result);
if(isSync)
{
dispatch_group_leave(group);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", [error localizedDescription]);
if(isSync)
{
dispatch_group_leave(group);
}
}];
[op start];
if(isSync)
{
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
}
我错过了什么吗?
答案 0 :(得分:0)
我遇到了完全相同的问题并花了一些时间才意识到该操作会在特定队列中运行块(默认队列)。
也就是说,假设您在同一队列中运行代码,如果使用dispatch_group_wait
阻止/停止正在运行的代码,则成功和失败块将永远不会运行。要解决此问题,您可以将完成队列和组添加到操作中,使操作在不同的队列中运行块。下面的代码是快速的,不确定它在objective-c中是否相同。
operation.completionQueue = queue;
operation.completionGroup = postGroup;