如何在ios应用程序中处理异步请求以休息api

时间:2015-02-26 06:02:27

标签: ios objective-c api rest nsurlconnection

让我们说我想使用某些服务的其余API,Twitbookr来获取用户的个人资料信息。所以我让用户通过我的应用程序登录,我获得了拨打电话所需的凭据。

在此之后我加载了一个新的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"];

但请求尚未完成,因此程序会抛出错误。

我希望拨打更多电话来获取不同类型的数据,例如,首页专辑中的图片,这些图片依赖于我只能通过上述请求获得的用户ID。那么如何进行下一次后续通话以确保我已经拥有第一次通话中的用户ID?

处理这种情况的正确方法是什么?

我应该使用同步请求吗? 在我的所有要求完成之前,我是否应该加载一个加载符号?如果是这样,我如何测试请求实际上已完成?他们异步的重点是什么?

1 个答案:

答案 0 :(得分:0)

试试这个

[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属性 更新:正如迈克所说,只在主线程上更新UI。

相关问题