从Progress对象创建Observable



我正在尝试在我的应用程序中使用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 { $0 }
.takeUntil(.inclusive, predicate: { $0 >= 1.0 })
.subscribe(observer)
}
}

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

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

最新更新