从 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(_:)
运算符,请 而不是 忽略传递到闭包中的参数。如果你这样做,你将无法发射任何东西。
我正在尝试在我的应用程序中使用 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(_:)
运算符,请 而不是 忽略传递到闭包中的参数。如果你这样做,你将无法发射任何东西。