猿问

AFNetworking可以同步(在块内)返回数据吗?

我有一个使用AFJSONRequestOperation的函数,我希望仅在成功后返回结果。你能指出我正确的方向吗?我对块和AFNetworking还是一无所知。


-(id)someFunction{

    __block id data;


    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request

        success:^(NSURLRequest *request, NSHTTPURLResponse *response, id json){

            data = json;

            return data; // won't work

        }

        failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){


        }];




    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [queue addOperation: operation];


    return data; // will return nil since the block doesn't "lock" the app.

}


月关宝盒
浏览 404回答 3
3回答

慕村9548890

要在操作完成之前阻止主线程的执行,可以在将主线程[operation waitUntilFinished]添加到操作队列之后执行。在这种情况下,您不需要return在代码块中;设置__block变量就足够了。也就是说,我强烈建议不要将异步操作强制为同步方法。有时候动不动就很棘手,但是如果有任何方法可以将其构造为异步的,那几乎肯定是要走的路。

噜噜哒

我正在使用信号量来解决此问题。此代码在继承自的我自己的类中实现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;

慕虎7371278

我建议您不要使用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];}
随时随地看视频慕课网APP

相关分类

iOS
我要回答