У меня есть две функции ниже:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath)
let message = self.messages[indexPath.row]
// Set table cell values
getUserFriendlyName(sid: message.sid!, arg: true, completion: { (success) -> Void in
cell.detailTextLabel?.text = self.friendly_name
cell.textLabel?.text = message.body
cell.selectionStyle = .none
//self.tableView.reloadData()
})
return cell
}
и
func getUserFriendlyName(sid: String, arg: Bool, completion: @escaping (Bool) -> ()) {
let ACCOUNT_IDENTITY: String = "AC***redacted"
let AUTH_TOKEN: String = "**redacted"
let SERVICE_ID: String = "IS***redacted"
let loginString = "\(ACCOUNT_IDENTITY):\(AUTH_TOKEN)"
let loginData = loginString.data(using: String.Encoding.utf8)
let base64LoginString = loginData!.base64EncodedString()
let url = URL(string: "https://chat.twilio.com/v2/Services/IS***redacted/Users/US***redacted")
var request = URLRequest(url: url!)
var session = URLSession.shared
request.httpMethod = "GET"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
request.addValue("application/json", forHTTPHeaderField: "Accept")
//request.addValue(AUTH_TOKEN, forHTTPHeaderField: "Authorization")
var fn: String!
let task = session.dataTask(with: request, completionHandler: { data, response, error in
var strData = String(data: data!, encoding: String.Encoding.utf8)
print("Body: \(strData)")
guard error == nil else {
print(error!)
return
}
guard let data = data else {
print("Data is empty")
return
}
let json = try! JSONSerialization.jsonObject(with: data, options: []) as! NSDictionary
//getting the json response
print(json)
fn = json["friendly_name"] as! String?
self.friendly_name = fn
completion(arg)
//return fn
//print(fn)
})
task.resume()
}
Вот проблема, с которой я сталкиваюсь ... Когда обнаруживается новое сообщение чата,Функция tableView вызывается.Новая ячейка создается с текстом и подтекстом.Поскольку нативный код Twilio не позволяет мне отображать понятное имя того, кто написал чат, я должен пойти и сделать HTTP-вызов, поэтому я вызываю getUserFriendlyName ().Поскольку resumeTask () является асинхронным, поток программы выглядит следующим образом:
- Введена функция tableView
- Я выполняю вызов getUserFriendlyNameFunction (), который вводится
- Когда мы получаем HTTP-запрос, вызывается resumeTask (), а затем поток возвращается к функции tableView, в частности, к завершению вызова функции с понятным именем пользователя, и он выполняет возвратную строку Cell, что означаетячейка создана, но содержит данные прототипа, а именно «Заголовок» для текста и «Подзаголовок» для текста описания.
- Затем поток возвращается к HTTP-запросу и выполняется
- Поток возвращается к строке кода непосредственно после вызова getUserFriendlyName () внутри функции tableView.Этот код устанавливает текстовые и подробные текстовые значения для данных, возвращаемых вызовом HTTP.Но на данный момент ячейка уже существует в моем tableView.Поэтому у меня осталась только ячейка, содержащая «Текст» и «Подтекст».
Что я пробовал:
Добавление tableView.reloadData () после выполнения последних строк кода в функции tableView.Это не обновило tableView с данными из HTTP-вызова.Фактически, он постоянно обновлял tableView снова и снова.
Перемещение последних трех строк кода в ту же точку, что и строка «возвратная ячейка».Это также не сработало.
Я пришел к выводу, что моя единственная надежда - это завершениеHandler / userCompletionHandler.Я играл с ними в течение долгого времени и не могу получить желаемый результат, а именно: заполнить первое входящее сообщение чата данными из HTTP-запроса.
Кто-нибудь может помочь?