我开始使用JSON(对Web服务来说是全新的)并且这样做是为了从Wunderground API收集数据。这个--synchronous-代码对我有用:
NSDictionary *weatherData;
NSString *urlString;
if (self.apiKey) {
urlString = [@"http://api.wunderground.com/api/" stringByAppendingString:self.apiKey];
}
urlString = [urlString stringByAppendingString:@"/conditions/q/CA/San_Francisco.json"];;
NSURL *url = [NSURL URLWithString:urlString];
NSData *jasonData = [NSData dataWithContentsOfURL:url];
NSError *error;
weatherData = [NSJSONSerialization JSONObjectWithData:jasonData options:0 error:&error];
if (error) {
NSLog(@"Error creating JSON Object, error description = %@", [error localizedDescription]);
}
return weatherData;
// returns a dictionary
但这不是:
__block NSDictionary *weatherData;
dispatch_queue_t weatherDataQueue = dispatch_queue_create("weatherDataQueue", NULL);
dispatch_async(weatherDataQueue, ^{
NSString *urlString;
if (self.apiKey) {
urlString = [@"http://api.wunderground.com/api/" stringByAppendingString:self.apiKey];
}
urlString = [urlString stringByAppendingString:@"/conditions/q/CA/San_Francisco.json"];;
NSURL *url = [NSURL URLWithString:urlString];
NSData *jasonData = [NSData dataWithContentsOfURL:url];
NSError *error;
weatherData = [NSJSONSerialization JSONObjectWithData:jasonData options:0 error:&error];
if (error) {
NSLog(@"Error with creating JSON Object, error description %@", [error localizedDescription]);
}
});
NSLog(@"weatherData = %@", weatherData);
return weatherData;
// returns NULL
现在,我意识到这可能与我返回weatherData
时的事实有关,即调度块中的代码尚未运行。
如果有人能帮助我弄清楚如何解决这个问题,我将不胜感激。
答案 0 :(得分:4)
当异步做某事时,你需要触发“嘿,我已经下载了数据!”来自异步执行的代码。
也就是说,加载数据的块的结尾会执行以下操作:
dispatch_async(dispatch_get_main_queue(), ^{
... do whatever is necessary to load/display the data in the UI here ...
});
答案 1 :(得分:0)
我可以提出一个可以大大简化生活的建议 - 使用AFNetworking进行网络操作。
或者,您需要将回调块传递给您的函数,然后可以使用weatherData
值执行。您对weatherData
错误的假设是正确的。
答案 2 :(得分:0)
我建议发布一个 NSNotification ,然后为该通知设置一个监听器,并在那时对weatherData执行必要的代码。
虽然我最喜欢@bbum的建议。