У меня есть 2 объекта. Note
и User
.Ручка, заполняющая табличное представление асинхронными вызовами API
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"
}
]
}
Обратите внимание, что в этом ответе вы получите только идентификатор пользователя. Поэтому, чтобы получить информацию о пользователе (имя, фамилия и т. Д.), Есть еще один вызов API. Когда вы передаете идентификатор пользователя, он дает данные этого пользователя. Это его ответ JSON.
{
"status": "success",
"data": {
"id": 2,
"email": "[email protected]",
"first_name": "John",
"last_name": "Appleseed",
"avatar": "avt.png"
}
}
Обратите внимание, что оба этих метода API возвращают результаты асинхронно. Это подводит меня к моей проблеме.
Мне нужно отобразить все эти примечания в виде разделенного раздела с полным именем пользователя каждой заметки в нижнем колонтитуле.
Проблема заключается в том, что пользовательский запрос 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
для получения сведений о пользователе. Но так как это асинхронно, табличное представление не будет ждать, пока оно не получит данные этого пользователя. К тому времени, как вы это получите, он, возможно, перешел к другой заметке и отменил асинхронные звонки повсюду!
Кто-нибудь понял, как правильно справиться с этой ситуацией?