2015-07-30 3 views
1

У меня есть 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 для получения сведений о пользователе. Но так как это асинхронно, табличное представление не будет ждать, пока оно не получит данные этого пользователя. К тому времени, как вы это получите, он, возможно, перешел к другой заметке и отменил асинхронные звонки повсюду!

Кто-нибудь понял, как правильно справиться с этой ситуацией?

ответ

1

Подход к решению этого может помочь вам.

  1. Вы можете запустить второй запрос (getUserDetails) в блок успеха вашего первого вызова API. (Или какой метод/делегат вы будете использовать для обработки приема данных с сервера)

  2. На успех второго запроса, вы можете просто перезагрузить таблицу, чтобы показать соответствующие данные

Так как это требуется время, чтобы показать детали, которые вы могли бы добавить индикатор активности, и скрыть таблицу до получения всех необходимых данных с сервера.

Я предполагаю, что вы используете отдельный блок или делегат, который будет выполнять обработку данных с сервера.

Если вы стратегически размещаете свои серверные запросы на методы обработки успеха один за другим, даже если ваши данные взаимосвязаны, а вызовы асинхронны - вы получаете синхронный поток.

Надеюсь, что это поможет!

Смежные вопросы