看起来我还没有完全理解块的概念......
在我的代码中,我必须从asychronous block
中获取要从“outer
”方法返回的JSON数据。我用Google搜索并发现,如果定义variable with __block
,则该变量扩展为_mutability_ of
。{/ 1}}。{/ p>
但由于某些原因,返回的json对象是nil。我想知道为什么?
block
答案 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对象才是正确的。
希望这件事!!