首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReactiveKit:观察一组信号,当它们全部完成时执行某些操作

ReactiveKit:观察一组信号,当它们全部完成时执行某些操作
EN

Stack Overflow用户
提问于 2019-08-09 18:39:42
回答 1查看 477关注 0票数 1

我对反应式编程非常陌生,并且在我的应用程序中使用了带有ReactiveKit的Bond。我现在遇到了一个我不太清楚的问题。

问题是,在某个页面上,我必须上传许多图像,当所有图像都上传后,我想要做一些事情。

这是我到目前为止所拥有的代码:

代码语言:javascript
复制
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数组的可观察值。在执行uploadImages时,我希望使用函数user.uploadImage上传所有图像,并且在所有上传完成后,我希望调用uploadImages函数的completionHandler

在这一点上,我有了一个信号数组,但是我不知道如何观察所有的信号,或者是一种将它们组合成一个信号的方法?

EN

回答 1

Stack Overflow用户

发布于 2019-09-11 10:01:49

我认为如果您将函数拆分一下会对您有所帮助:

代码语言:javascript
复制
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)
        }
    }
}

上面的代码会将一个单独的上传封装在一个信号中。然后,您可以:

代码语言:javascript
复制
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")
    }
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57428347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档