获取ASIBasicBlock中的返回值

时间:2011-07-23 02:25:15

标签: asihttprequest objective-c-blocks

我有一个视图控制器,它将发出服务器请求。我已将所有服务器请求处理程序放在一个类中。所以在视图控制器中,只需使用[Apihandler getlist]来获取列表。

在班级Apihandler中,我在

中使用了块
[_request setCompletionBlock:^{}]

获取服务器响应(JSON对象)。

如果JSON对象包含名为“error”的键/值,我会将其视为失败,尽管它已完成ASIHttpRequest本身。否则就会成功。

问题是:如何获得上述完成块的返回值?我检查了ASI文档,ASIBasicBlock是void返回类型。

1 个答案:

答案 0 :(得分:2)

我是和代表一起做的。所以我的代码看起来像这样:

[request setCompletionBlock:^{
    NSLog(@"Data retrieved");
    NSData *data = [request responseData];
    NSLog(@"Status Code: %d", [request responseStatusCode]);
    dispatch_async(backgroundQueue, ^(void){
        [self processData:data];
    });
}];

这基本上说当这个完成块运行时,在后台调用processData消息。在processData消息中,我使用委托将数据返回到我的主UI线程。该消息如下所示:

- (void)processData:(NSData *)data {

    NSError *error = nil;
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];


    dispatch_async(dispatch_get_main_queue(), ^(void){
        [self.delegate requestDataReady:json];
    });
}

我希望有所帮助。

更新:

当然,您不必在后台线程中运行process方法。您可以轻松地在块中调用[self processData:data],甚至可以将processData中的代码放在块中。