处理使用异步API调用填充tableview

时间:2015-07-30 10:07:28

标签: ios swift uitableview asynchronous

我有2个物体。 NoteUser

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方法都异步返回结果。这让我想到了我的问题。

我需要在一个带分区的tableview中显示所有这些音符,并在页脚中显示每个音符的用户全名。

问题是因为用户详细信息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 个答案:

答案 0 :(得分:1)

解决这个问题的方法可能对你有帮助。

  1. 您可以在第一个API调用的成功块中触发第二个请求(getUserDetails)。 (或者您将用于处理从服务器接收数据的任何方法/代理)

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

  3. 由于显示详细信息需要时间,因此您可以添加活动指示器并隐藏表,直到您从服务器收到所有必需的数据。

    我假设您正在使用一个单独的块或委托来处理来自服务器的数据响应。

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

    希望有所帮助!