3 回答
TA贡献1884条经验 获得超4个赞
要在操作完成之前阻止主线程的执行,可以在将主线程[operation waitUntilFinished]
添加到操作队列之后执行。在这种情况下,您不需要return
在代码块中;设置__block
变量就足够了。
也就是说,我强烈建议不要将异步操作强制为同步方法。有时候动不动就很棘手,但是如果有任何方法可以将其构造为异步的,那几乎肯定是要走的路。
TA贡献1784条经验 获得超7个赞
我正在使用信号量来解决此问题。此代码在继承自的我自己的类中实现AFHTTPClient。
__block id result = nil;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
NSURLRequest *req = [self requestWithMethod:@"GET"
path:@"someURL"
parameters:nil];
AFHTTPRequestOperation *reqOp = [self HTTPRequestOperationWithRequest:req
success:^(AFHTTPRequestOperation *operation, id responseObject) {
result = responseObject;
dispatch_semaphore_signal(semaphore);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
dispatch_semaphore_signal(semaphore);
}];
reqOp.failureCallbackQueue = queue;
reqOp.successCallbackQueue = queue;
[self enqueueHTTPRequestOperation:reqOp];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_release(semaphore);
return result;
TA贡献1802条经验 获得超4个赞
我建议您不要使用AFNetworking(或通常使用块)来创建同步方法。一个好的方法是您使用另一种方法,并将成功块中的json数据用作参数。
- (void)methodUsingJsonFromSuccessBlock:(id)json {
// use the json
NSLog(@"json from the block : %@", json);
}
- (void)someFunction {
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id json){
// use the json not as return data, but pass it along to another method as an argument
[self methodUsingJsonFromSuccessBlock:json];
}
failure:nil];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation: operation];
}
- 3 回答
- 0 关注
- 403 浏览
添加回答
举报