如何按顺序链接 RxSwift Singles
How to chain RxSwift Singles in order
假设我想要 运行 3 种方法,入口点取决于整数(数字)。
func method1() -> Single<Void> {
return .just(())
}
func method2() -> Single<Void> {
return .just(())
}
func method3() -> Single<Void> {
return .just(())
}
在常规 Swift 中会有这样的切换:
func doThings(startingFrom number: Int) -> Single<Void> {
switch number {
case 0:
method1()
fallthrough
case 1:
method2()
fallthrough
case 2:
method3()
fallthrough
default:
print("Finished")
}
return .just(())
}
但考虑到 method1()、method2() 和 method3 是单一的,我认为 RxSwift 中应该有一种方法可以将它们链接起来而不会弄乱它们的执行顺序。
我是这样想的,但它是同步工作的,因此无法保证方法的执行顺序。
public func doThings(startingFrom number: Int) -> Single<Void> {
var actions: [Single<Void>] = []
switch number {
case 0:
actions.append(method1())
fallthrough
case 1:
actions.append(method2())
fallthrough
case 2:
actions.append(method3())
fallthrough
default:
break
}
return Single
.zip(actions)
.do(onSuccess: { _ in
Log.debug("Finished")
})
.mapToVoid()
}
对不起,如果我没有理解,我是 Rx 的新手Swift。如有不妥请指正
您的解决方案非常接近。只需使用 concat
而不是 zip
就可以了。
糟糕,Single 缺少 concat
运算符,因此您必须先转换为 Observable 或 Completable。这里有几个选项:
func doThings(startingFrom number: Int) -> Single<Void> {
Observable.concat(
[method1(), method2(), method3()]
.dropFirst(number)
.map { [=10=].asObservable() }
)
.toArray()
.map(to: ())
.do(onSuccess: { _ in
print("Finished")
})
}
func doThingsʹ(startingFrom number: Int) -> Single<Void> {
Completable.concat(
[method1(), method2(), method3()]
.dropFirst(number)
.map { [=10=].asCompletable() }
)
.andThen(.just(()))
.do(onSuccess: { _ in
print("Finished")
})
}
假设我想要 运行 3 种方法,入口点取决于整数(数字)。
func method1() -> Single<Void> {
return .just(())
}
func method2() -> Single<Void> {
return .just(())
}
func method3() -> Single<Void> {
return .just(())
}
在常规 Swift 中会有这样的切换:
func doThings(startingFrom number: Int) -> Single<Void> {
switch number {
case 0:
method1()
fallthrough
case 1:
method2()
fallthrough
case 2:
method3()
fallthrough
default:
print("Finished")
}
return .just(())
}
但考虑到 method1()、method2() 和 method3 是单一的,我认为 RxSwift 中应该有一种方法可以将它们链接起来而不会弄乱它们的执行顺序。
我是这样想的,但它是同步工作的,因此无法保证方法的执行顺序。
public func doThings(startingFrom number: Int) -> Single<Void> {
var actions: [Single<Void>] = []
switch number {
case 0:
actions.append(method1())
fallthrough
case 1:
actions.append(method2())
fallthrough
case 2:
actions.append(method3())
fallthrough
default:
break
}
return Single
.zip(actions)
.do(onSuccess: { _ in
Log.debug("Finished")
})
.mapToVoid()
}
对不起,如果我没有理解,我是 Rx 的新手Swift。如有不妥请指正
您的解决方案非常接近。只需使用 concat
而不是 zip
就可以了。
糟糕,Single 缺少 concat
运算符,因此您必须先转换为 Observable 或 Completable。这里有几个选项:
func doThings(startingFrom number: Int) -> Single<Void> {
Observable.concat(
[method1(), method2(), method3()]
.dropFirst(number)
.map { [=10=].asObservable() }
)
.toArray()
.map(to: ())
.do(onSuccess: { _ in
print("Finished")
})
}
func doThingsʹ(startingFrom number: Int) -> Single<Void> {
Completable.concat(
[method1(), method2(), method3()]
.dropFirst(number)
.map { [=10=].asCompletable() }
)
.andThen(.just(()))
.do(onSuccess: { _ in
print("Finished")
})
}