我对RxSwift相当新,所以我有以下问题,假设我有3个Observable示例函数,它们返回不同的可观察类型:
func observableFunc1(item1: DummyObject) -> Observable<AVURLAsset> {
return Observable.create { observer in
let something_with_AVURLAsset = AVURLAsset(url: URL(fileURLWithPath: "file"))
observer.onNext(something_with_AVURLAsset)
observer.onCompleted()
return Disposables.create()
}
}
func observableFunc2(item: AVURLAsset) -> Observable<Data> {
return Observable.create { observer in
let something_with_data = Data()
observer.onNext(something_with_data)
observer.onCompleted()
return Disposables.create()
}
}
func observableFunc3(_ params: [String:Any]) -> Observable<Any> {
let disposeBag = DisposeBag()
return Observable.create { observer in
RxAlamofire.request(api.sendData(params)).debug().subscribe(
onNext: { reponse in
observer.onCompleted()
},
onError: { error in
observer.onError(customError.theError("error"))
}
)
.addDisposableTo(disposeBag)
return Disposables.create()
}
}
如何依次执行这3个函数,并在func2上使用func1的返回值,然后在func2完成后运行func3。
我希望我能够明确地提出这个问题,但是我再次对RxSwift很陌生,我不知道这些操作是否可行。
答案 0 :(得分:1)
这是一个例子......
假设你有三个功能:
func func1() -> Observable<Data1>
func func2(_ data: Data1) -> Observable<Data2>
func func3(_ data: Data2) -> Observable<Data3>
然后你可以:
let a = func1()
let b = a.flatMap { func2($0) }
let c = b.flatMap { func3($0) }
或:
let c = func1()
.flatMap { func2($0) }
.flatMap { func3($0) }
那就是说,你的observableFunc3
已经破了。您需要从中取出处理袋。目前,网络呼叫将在启动前取消。
如果你真的不希望它发出任何值,那么:
func observableFunc3(_ params: [String:Any]) -> Observable<Void> {
return RxAlamofire.request(api.sendData(params))
.filter { false }
}
以上内容会发出completed
或error
但不会发出next
个值。
最好是把它写成:
func observableFunc3(_ params: [String:Any]) -> Observable<Void> {
RxAlamofire.request(api.sendData(params))
.map { _ in }
}
上面会发出一个next
,然后是completed
或error
。这样做更好,因为你可以在它之后映射或flatMap,一旦它完成就会发生。