У меня есть tableView в ViewController, содержащий массив объектов Channel
;массив заполняется из строки json, сохраненной в моей базе данных CoreData
парсинг json и создание объектов Channel
У меня может быть типичная переменная, такая как id, имя канала и члены разговора;это объект Channel
class Channel: NSObject {
var id: String?
var name: String?
var members = [Member]()
var profileImage: UIImage?
override init() {
super.init()
}
init(id: String, name: String, members: [String]) {
super.init()
self.id = id
self.name = name
for idMember in members {
let newMember = Member(id: idMember)
self.members.append(newMember)
}
}
func loadPhoto(id: Int, completion: @escaping (Bool) -> Void) {
Helper.getImage(id: id) { (imageResult) in
if let image = imageResult {
self.profileImage = image
completion(true)
} else {
completion(false)
}
}
}
}
Переменная profileImage должна быть взята с Сервера с API, проблема в том, что когда объект был создан при разборе json в функции getDataFromCoreData()
the Channel
объекты в массиве имеют переменную id, name и members, но по-прежнему не имеют изображений, поэтому в моем tableView будут строки для различных каналов, но без profileImage из-за асинхронного вызова.
InВ моем случае перезагрузить таблицу для визуализации изображений сделал функцию loadImages()
для ожидания завершения асинхронного вызова и перезагрузить tableView
import UIKit
import Firebase
class ConversationsViewController: UIViewController {
var channelList = [Channel]()
override func viewDidLoad() {
super.viewDidLoad()
//I get the channelList from a JSON saved like a string in my coreData with a custom function
channelList = getDataFromCoreData()
loadImages()
}
func loadImages() {
for channel in self.channelList {
channel.loadPhoto(id: channel.id) { success in
if success {
self.chatTable.reloadData()
}
}
}
}
}
extension ConversationsViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MessageChannelTableViewCell
var channel = channelList[indexPath.row]
cell.titleLabel.text = channel.name
if let profileImage = channel.profileImage {
cell.profileImage.image = profileImage
} else {
if channel.members.count > 2 {
cell.profileImage.image = theme.groupChatImage
} else {
cell.profileImage.image = UIImage(named: "profile-icon")!
}
}
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return channelList.count
}
}
Я знаю, что вопрос может быть длинным и скучным, но яхотите узнать, есть ли лучший способ сделать это, и если да, вы можете сказать мне, чтобы улучшить мой код