从 Progress 对象创建 Observable

Create Observable from Progress object

我正在尝试在我的应用程序中使用 Google MLKitTranslate 框架进行离线翻译。我写了一个下载语言模型的函数。

public func downloadModel(forLanguage language: TranslateLanguage) -> Observable<Double> {
    let model = TranslateRemoteModel.translateRemoteModel(language: language)

    return Observable<Double>.create { _ -> Disposable in

      // Observe the download progress
      self.progress = ModelManager.modelManager().download(
        model,
        conditions: ModelDownloadConditions(
          allowsCellularAccess: true,
          allowsBackgroundDownloading: true
        )
      )

      return Disposables.create()
    }
  }

progress 这里有 Progress 类型。

但是我想创建一个 Observable,当我在 .fractionComplete 中有更新时发送一个 .next 事件,当 .fractionComplete 为 1.0 时发送一个 .completed 事件。

我曾尝试在进度对象上使用 .rx.observe.rx.observeWeakly (KVO),但没有成功。

那么如何从这个 Progress 事件创建一个可观察对象?非常感谢帮助。

这应该有效:

func downloadModel(forLanguage language: TranslateLanguage) -> Observable<Double> {
    let model = TranslateRemoteModel.translateRemoteModel(language: language)
    return Observable.create { observer -> Disposable in
        let progress = ModelManager.modelManager().download(
            model,
            conditions: ModelDownloadConditions(
                allowsCellularAccess: true,
                allowsBackgroundDownloading: true
            )
        )

        return progress.rx.observe(Double.self, "fractionCompleted")
            .compactMap { [=10=] }
            .takeUntil(.inclusive, predicate: { [=10=] >= 1.0 })
            .subscribe(observer)
    }
}

有几点需要注意。这不是一个方法,不要把它放在class中。这是一项免费功能。 progress 对象不需要被任何 class 保留,模型管理器将保留它并在不再需要时释放它。

如果您使用 create(_:) 运算符,请 而不是 忽略传递到闭包中的参数。如果你这样做,你将无法发射任何东西。