如何在 iOS 应用程序中处理对 Rest API 的异步请求

问题描述 投票:0回答:1

假设我想使用某个服务 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?

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

我应该使用同步请求吗? 在我的所有请求完成之前,我是否应该放置一个加载符号?如果是这样,我如何测试请求是否实际完成?它们异步的意义何在?

ios objective-c rest nsurlconnection
1个回答
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 属性 更新:正如 Mike 所说,仅在主线程上更新 UI。

© www.soinside.com 2019 - 2024. All rights reserved.