【发布时间】:2019-04-15 18:58:19
【问题描述】:
我遇到了一种情况,我会获取一个 API,该 API 将生成注册用户的 json 数据。然后我必须遍历每个用户并从远程 url 获取他们的头像并将其保存到磁盘。我可以在subscribe 中执行第二个任务,但这不是最佳实践。我正在尝试使用map、flatMap 等来实现它。
这是我的示例代码:
self.dataManager.getUsers()
.observeOn(MainScheduler.instance)
.subscribeOn(globalScheduler)
.map{ [unowned self] (data) -> Users in
var users = data
// other code for manipulating users goes here
// then below I am trying to use another loop to fetch their avatars
if let cats = users.categories {
for cat in cats {
if let profiles = cat.profiles {
for profile in profiles {
if let thumbnail = profile.thumbnail,
let url = URL(string: thumbnail) {
URLSession.shared.rx.response(request: URLRequest(url: url))
.subscribeOn(MainScheduler.instance)
.subscribe(onNext: { response in
// Update Image
if let img = UIImage(data: response.data) {
try? Disk.save(img, to: .caches, as: url.lastPathComponent)
}
}, onError: { (error) in
}).disposed(by: self.disposeBag)
}
}
}
}
}
return users
}
.subscribe(onSuccess: { [weak self] (users) in
}).disposed(by: disposeBag)
这段代码有两个问题。首先是URLSession 上的rx,它在另一个线程的后台执行任务,当此操作完成时,无法确认主subscribe。其次是循环和 rx 效率不高,因为它应该生成多个 observables 然后对其进行处理。
欢迎任何改进此逻辑的想法。
【问题讨论】:
-
我想推荐
af_image库来设置头像并摆脱嵌套订阅者。你试过吗? -
该库将异步下载图像,我找不到通知主
subscribe的方法 -
它接受一个完成,如果我是你,我会在
class范围内创建一些主要的订阅变量并使用 af_image。否则,您应该处理嵌套订阅。我认为不会有第三种方式。如果有人可以提出另一种方式,我也很感兴趣。所以让我们等待! ??????祝你好运