gpt4 book ai didi

swift - RxSwift `ActivityIndicator` 组合中的功能

转载 作者:行者123 更新时间:2023-12-04 17:24:22 28 4
gpt4 key购买 nike

我已经使用 RxSwift 几年了,我开始探索 Combine with SwiftUI 并且在尝试从 Combine 中复制 RxSwift 的一些功能时遇到了一些麻烦。

在 RxSwift 上 GitHub在名为 ActivityIndi​​cator.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 驱动程序,并且它会在每次订阅或订阅完成时发出 bool 值。

然后您可以使用 RxCocoa 直接驱动 UIActivityIndi​​catorView 的 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 运算符的工作方式,我可以通过链转发来自订阅的事件,但更改 isActive 每次订阅/完成/取消时的值。

在 SwiftUI View 中,我将启动 doSomething 函数并接收它,同时还能够使用已发布的 isActive 属性来显示/隐藏 进度 View

类似的东西:

struct SomeView: View {
let viewModel = ViewModel()

var body: some View {
var cancelBag = Set<AnyCancellable>()

VStack {
Text("This is text")

if viewModel.isActive {
ProgressView()
}
}
.onAppear(perform: {
viewModel
.doSomething()
.sink()
.store(in: &cancelBag)
})
}
}

有没有什么东西已经像这样工作了,我只是完全错过了?

如果没有,我该如何着手在 Combine 中复制 RxSwift 功能?

提前感谢您的帮助。

最佳答案

看起来有人创建了 Combine 版本。我不知道它是否与@Daniel T. 讨论的问题相同,但看起来很有希望。 https://github.com/duyquang91/ActivityIndicator

关于swift - RxSwift `ActivityIndicator` 组合中的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64379083/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com