【问题标题】:How to handle asynchronous requests to rest apis in an ios app如何在ios应用程序中处理对rest apis的异步请求
【发布时间】:2015-02-26 06:02:26
【问题描述】:

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

但是请求还没有完成,所以程序会抛出错误。

并且我想进行更多调用以获取不同类型的数据,例如,来自首页相册的图片,这些图片依赖于我只能从上面的请求中获取的用户 ID。那么如何进行下一次后续通话以确保我已经拥有第一次通话的用户 ID?

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

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

【问题讨论】:

    标签: ios objective-c api rest nsurlconnection


    【解决方案1】:

    试试这个

    [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
            });
    })];
    

    当你使用异步请求时,使用完成块中的数据。我认为你的代码

            self.nameLabel.text = self.data.name;
    

    错了,因为 self.data 看起来像 NSData,而且它没有 name 属性 更新:正如 Mike 所说,只在主线程上更新 UI。

    【讨论】:

    • 他不能使用completion block中的数据来更新UI,除非用dispatch_async包裹到主线程,否则会crash。
    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 2018-02-28
    • 2021-02-18
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多