ios - 处理使用异步 API 调用填充 TableView

标签 ios swift uitableview asynchronous

我有 2 个对象。 注释用户

public class Note {
    var userId: Int
    var createdAtDate: NSDate
    var content: String?

    init(userId: Int, createdAtDate: NSDate) {
        self.userId = userId
        self.createdAtDate = createdAtDate
    }
}

public class User {
    var id: Int
    var firstName: String
    var lastName: String
    var email: String
    var avatar: UIImage?

    init(id: Int, firstName: String, lastName: String, email: String) {
        self.id = id
        self.firstName = firstName
        self.lastName = lastName
        self.email = email
    }
}

并且有两个 API 方法。一个列出所有注释。这是您获得的 JSON 响应。

{
  "status": "success",
  "data": [
    {
      "user_id": 2,
      "note": "This is a test\r\n\r\nThis is only a test.\r\n\r\nbeep boop",
      "created_at": "2015-07-29 04:39:25"
    }
  ]
}

请注意,您只能在此响应中获取用户 ID。因此,要获取用户详细信息(名字、姓氏等),还有另一个 API 调用。当您传递用户 ID 时,它会提供该用户的详细信息。这是它的 JSON 响应。

{
  "status": "success",
  "data": {
    "id": 2,
    "email": "dev@example.com",
    "first_name": "John",
    "last_name": "Appleseed",
    "avatar": "avt.png"
  }
}

请注意,这两种 API 方法都异步返回结果。这让我想到了我的问题。

我需要在分节表格 View 中显示所有这些注释,并在页脚中显示每个注释的用户全名。

问题是因为用户详细信息 API 调用是异步的,所以它发生在不同的线程中并且需要时间来接收结果。但是将笔记加载到 tableview 是单独发生的,所以我无法弄清楚当用户的详细信息到达时如何映射每个笔记的用户。

func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? {
    let note = notes[section]
    APIClient.getUserDetails(id: id, success: { (data) -> Void in

    }) { (error) -> Void in

    }

    return ""
}

例如,让我们以 notes 数组中的第一个音符为例。它获取该注释的 userId 并将其传递给 getUserDetails 方法以检索用户详细信息。但由于这是异步的,tableview 不会等到它收到该用户的详细信息。当你得到它时,它可能已经转移到另一个音符上并在整个地方分离异步调用!

有人知道如何正确处理这种情况吗?

最佳答案

解决此问题的方法可能对您有所帮助。

  1. 您可以在第一次 API 调用的成功 block 中触发第二个请求 (getUserDetails)。 (或者您将使用哪种方法/委托(delegate)来处理从服务器接收数据)

  2. 第二次请求成功后,您只需重新加载表格即可显示适当的数据

由于显示详细信息需要时间,您可以添加一个事件指示器并隐藏表格,直到您从服务器收到所有需要的数据。

我假设您正在使用一个单独的 block 或委托(delegate)来完成处理来自服务器的数据响应的工作。

如果您有策略地将服务器请求放在成功处理方法上,一个接一个,即使您的数据相互关联并且调用是异步的,您也会获得类似同步的流程。

希望对您有所帮助!

关于ios - 处理使用异步 API 调用填充 TableView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31720860/

相关文章:

iphone - 视频模式下录制的快门声(叮)

ios - 如何从给定的数字中找到一个随机组合,这些数字加起来与 Swift 中的另一个数字相加?

xcode - UITableViewCell 从其他 View Controller 上的输入传输运行时断点(lldb)

ios - 无法在 IB 中设置 UITableViewCell 的背景颜色

ios - 设置CALayer的borderWidth属性只影响左右边框?

用于网站的 IOS 应用程序

ios - Xcode 上的空 Cocotouch 框架出错?

ios - 如何使我的页面 View Controller 不至于无穷无尽?

ios - 在 UITableView 中单击的事件

iOS PayUMoney SDK key 无效