假设我想使用某个服务 Twitbookr 的其余 API 来获取用户的个人资料信息。因此,我让用户通过我的应用程序登录,然后获得拨打电话所需的凭据。
此后我加载一个新的
ViewController
。我想用用户的个人资料信息填充此视图中的字段。所以我第一次调用 API:
[NSURLConnection sendAsynchronousRequest:req
queue:NSOperation.mainQueue
completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error)
{
// successfully fetch data using credentials
// assume complete code here including dispatch_async etc
self.data = data;
})];
然后我想使用数据:
self.nameLabel.text = [self.data objectForKey:@"name"];
self.userid = [self.data objectForKey:@"userid"];
但是请求还没有完成,所以程序会抛出错误。
而且我想进行更多的调用来获取不同类型的数据,例如首页相册中的图片,这些图片依赖于我只能从上面的请求中获取的userid。那么,我如何进行下一个后续调用,以确保我已经拥有第一次调用中的用户 ID?
处理这种情况的正确方法是什么?
我应该使用同步请求吗? 在我的所有请求完成之前,我是否应该放置一个加载符号?如果是这样,我如何测试请求是否实际完成?它们异步的意义何在?
试试这个
[NSURLConnection sendAsynchronousRequest:req
queue:NSOperation.mainQueue
completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error)
{
// successfully fetch data using credentials
self.data = data;
//Use data here
dispatch_async(dispatch_get_main_queue(), ^{
//Update UI here
});
})];
当您使用 AsynchronousRequest 时,请在完成块中使用数据。我认为你的代码
self.nameLabel.text = self.data.name;
是错误的,因为 self.data 看起来像 NSData,并且它没有 name 属性 更新:正如 Mike 所说,仅在主线程上更新 UI。