Я использую ReactiveSwift + SDWebImage для загрузки/кэширования пользовательских аватаров API, а затем отображаю их в своих ViewControllers.
У меня есть несколько ViewController, которые хотят отображать аватар пользователя, а затем прослушивают его асинхронную загрузку.
Как мне лучше всего реализовать описанный ниже процесс?
Поток, который я хотел бы создать здесь:
ViewControllerA
хочу получить доступ к аватару пользователя- это первый доступ к userAvatar, затем сделайте запрос API
ViewControllerA
прослушивает сигналы userAvatarViewControllerA
временно отображать заполнительViewControllerB
хочу получить доступ к аватару пользователяViewControllerB
прослушивает сигналы userAvatarViewControllerB
временно отображать заполнитель- API-запрос аватара пользователя завершен, затем отправьте сигнал, наблюдаемый контроллерами представления.
- контроллеры просмотра обновляют свои
UIImageView
свежим изображением
Это мой фактический код:
class ViewControllerA {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// ... Cell creation
// type(of: user) == User.self (see class User below)
user.loadAvatarImage()
disposable = user.image.producer
.observe(on: UIScheduler())
.startWithValues { image in
// image is is either a placeholder or the real avatar
cell.userImage.image = image
}
}
}
class ViewControllerB {
override func viewDidLoad() {
super.viewDidLoad()
// type(of: user) == User.self (see class User below)
user.loadAvatarImage()
disposable = user.image.producer
.observe(on: UIScheduler())
.startWithValues { image in
// image is is either a placeholder or the real avatar
headerImageView.image = image
}
}
}
class User: Mappable {
// ... User implementation
let avatarImage = MutableProperty<UIImage?>(nil)
// To call before accessing avatarImage.value
func loadAvatarImage() {
getAvatar { image in
self.avatarImageProperty.value = image
}
}
private func getAvatar(completion: @escaping ((UIImage) -> Void)) {
// ... Async image download
competion(image)
}
}
Я не считаю, что вызов user.loadAvatarImage()
до прослушивания сигнала очень чистый...
Я знаю, что мой код не такой "реактивный", я все еще новичок в концепции реактивного. Не стесняйтесь критиковать, я пытаюсь улучшить себя
Заранее спасибо за совет.