如何解决合并中的RxSwift`ActivityIndicator`功能
我已经与RxSwift合作了几年,并且开始探索与SwiftUI结合使用,并且在尝试从Combine中的RxSwift复制某些功能时遇到一些麻烦。
在RxSwift GitHub上,有一个示例名为ActivityIndicator.swift
。
基本用法如下:
class Foo {
let activityIndicator = ActivityIndicator()
lazy var activity = activityIndicator.asDriver()
var disposeBag = DisposeBag()
func doSomething() {
Observable
.just("this is something")
.trackActivity(activityIndicator)
.subscribe()
.disposed(by: disposeBag)
}
}
它的作用是让您从activity
驱动程序中脱离出来,每当有订阅或完成订阅时,它将发出布尔值。
然后您可以使用RxCocoa直接驱动类似UIActivityIndicatorView的isAnimating属性之类的东西。
我一直在尝试找出如何在Combine中创建与此类似的内容,但是没有任何运气。
说我有一个如下所示的viewModel:
class ViewModel: ObservableObject {
@Published var isActive = false
func doSomething() -> AnyPublisher<Void,Never> {
Just(())
.delay(for: 2.0,scheduler: RunLoop.main)
.eraseToAnyPublisher()
}
}
我想做的是为Publisher
创建一个运算符,该运算符的作用类似于Rx运算符的工作原理,即我可以通过链转发订阅中的事件,但更改{{1} }每次订阅/完成/取消都会有价值。
在SwiftUI视图中,我将启动isActive
函数并沉入其中,同时还能够使用已发布的doSomething
属性显示/隐藏isActive
类似的东西:
ProgressView
我已经完全想念了吗?
如果没有,我该如何在Combine中复制RxSwift功能?
预先感谢您的帮助。
解决方法
嗯... ActivityIndicator
类的关键是Observable.using(_:observableFactory:)
运算符。不幸的是,我不认为Combine中有等效的运算符。
在订阅Observable时,using运算符创建资源,然后在Observable发送stop事件(完成或错误)时处理资源。这确保了资源的生命周期。在这种情况下,资源只会在创建时增加一个Int值,而在处置时减少它。
我认为您可以通过以下方式模仿行为:
extension Publisher {
func trackActivity(_ activityIndicator: CombineActivityIndicator) -> some Publisher {
return activityIndicator.trackActivity(of: self)
}
}
final class CombineActivityIndicator {
var counter = CurrentValueSubject<Int,Never>(0)
var cancelables = Set<AnyCancellable>()
func trackActivity<Source: Publisher>(of source: Source) -> some Publisher {
let sharedSource = source.share()
counter.value += 1
sharedSource
.sink(
receiveCompletion: { [unowned self] _ in
self.counter.value -= 1
},receiveValue: { _ in }
)
.store(in: &cancelables)
return sharedSource
}
var asPublisher: AnyPublisher<Bool,Never> {
counter
.map { $0 > 0 }
.eraseToAnyPublisher()
}
}
但是,上面的类将使Publisher发热,因此您可能会错过发出的值。使用自担风险,除非您绝望,否则我不建议您使用以上内容。
也许有人为Publisher编写了using
运算符,并且愿意共享。
看起来有人创建了一个组合版本。我不知道它是否与@Daniel T. 讨论的问题相同,但看起来很有希望。 https://github.com/duyquang91/ActivityIndicator
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。