gpt4 book ai didi

ios - ReactiveKit:观察一系列信号,当它们全部完成时做一些事情

转载 作者:行者123 更新时间:2023-11-28 07:23:08 25 4
gpt4 key购买 nike

我是响应式编程的新手,我在我的应用程序中使用 Bond 和 ReactiveKit。我现在遇到了一个我不太明白的问题。

问题是在某个页面上我必须上传一些图片,当所有图片都上传后,我想做点什么。

这是我目前的代码:

func uploadImages(completionHandler: @escaping EmptyBlock) {
let datas = profileImages.value.compactMap { $0?.jpegData(compressionQuality: 0.6) }

let signals = datas.map { data in
return Signal<String, Error> { observer in
self.user.uploadImage(data: data) { result in
switch result {
case .success(let url):
observer.receive(url)
observer.receive(completion: .finished)
case .failure(let error):
observer.receive(completion: .failure(error))
}
}

return SimpleDisposable(isDisposed: false)
}
}

// What can I do with `signals`?
}

所以我有一个属性 profileImages,它是一个 UIImage 数组的 Observable。当执行 uploadImages 时,我想使用 user.uploadImage 函数上传所有图片,当所有上传完成后,我想调用 uploadImages 函数的 completionHandler

此时我有一组信号,但我想不出如何观察所有这些信号,或者想出一种将它们组合成一个信号的方法?

最佳答案

我认为如果你把这个函数分解一下会对你有帮助:

extension User {
func uploadImage(data: Data) -> Signal<String, Error> {
return Signal { observer in
self.uploadImage(data: data) { result in
switch result {
case .success(let url):
observer.receive(url)
observer.receive(completion: .finished)
case .failure(let error):
observer.receive(completion: .failure(error))
}
}
return SimpleDisposable(isDisposed: false)
}
}
}

以上内容会将单个上传包装在信号中。然后你可以:

let user = self.user! // this is to avoid capturing `self` inside the map below.
let urlSignals = profileImages.value
.compactMap { $0?.jpegData(compressionQuality: 0.6) }
.map { user.uploadImage(data: $0) }
let urls = Signal(combiningLatest: urlSignals, combine: { $0 })

disposeBag += urls.observe(with: { event in
switch event {
case .next(let urls):
print("all urls:", urls)
case .failed(let error):
print("an upload failed:", error.localizedDescription)
case .completed:
print("upload complete")
}
})

关于ios - ReactiveKit:观察一系列信号,当它们全部完成时做一些事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57428347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com