繁体   English   中英

ReactiveKit:观察信号数组,在信号全部完成后执行一些操作

[英]ReactiveKit: observe an array of signals, do something when they are all completed

我对反应式编程非常陌生,并且在我的应用程序中将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 uploadImages

在这一点上,我有一系列信号,但是我无法弄清楚如何观察所有信号,或者无法将它们组合为一个信号?

我认为如果您对该功能进行一些分解,将对您有所帮助:

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")
    }
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM