从NSURLResponse完成块中获取数据

时间:2012-09-10 13:36:53

标签: objective-c ios nsurlconnection objective-c-blocks

看起来我还没有完全理解块的概念......

在我的代码中,我必须从asychronous block中获取要从“outer”方法返回的JSON数据。我用Google搜索并发现,如果定义variable with __block,则该变量扩展为_mutability_ of。{/ 1}}。{/ p>

但由于某些原因,返回的json对象是nil。我想知道为什么?

block

3 个答案:

答案 0 :(得分:20)

首先,回答你的问题:

  

但由于某种原因,返回的json对象是nil。我想知道为什么?

您返回的变量在您返回时尚未设置。在sendAsynchronousRequest:queue:completionHandler:方法返回后,您无法立即收集结果:调用必须在回调块并设置json变量之前完成往返。

现在快速说明如何处理它:您的方法是尝试将异步调用转换为同步调用。如果可以,尽量保持异步。不要期望返回NSMutableDictionary*的方法,而是创建一个方法来获取它自己的块,并在sendAsynchronousRequest:方法完成时将字典传递给该块:

- (void)executeRequestUrlString:(NSString *)urlString withBlock:(void (^)(NSDictionary *jsonData))block {
    // Prepare for the call
    ...
    // Make the call
    [NSURLConnection sendAsynchronousRequest:request
                                    queue:[NSOperationQueue currentQueue]
                        completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        NSLog(@"dataAsString %@", [NSString stringWithUTF8String:[data bytes]]);
        NSError *error1;
        NSMutableDictionary * innerJson = [NSJSONSerialization
            JSONObjectWithData:data options:kNilOptions error:&error1
        ];
        block(innerJson); // Call back the block passed into your method
        }];

}

答案 1 :(得分:2)

当您致电sendAsynchronousRequest:queue:completionHandler:时,您已请求异步请求。因此它将请求和块排队并立即返回。在将来的某个时刻发出请求,然后运行完成块。但到那时,return json已经很久了。

如果您希望能够同步返回数据,则必须发出同步请求。这将挂起此线程直到它完成,因此它不能是主线程。

答案 2 :(得分:0)

使用以下代码转换来自服务器的数据时检查字符串:

 NSLog(@"dataAsString %@", [NSString stringWithUTF8String:[data bytes]]);

如果字符串采用正确的JSON格式,则只有JSON对象才是正确的。

希望这件事!!