带参数的链式序列可观察对象
Chain sequence observables with arguments
我是 RxSwift 的新手,所以我遇到了以下问题,假设我有 3 个 Observable 示例函数,它们 return 不同的可观察类型:
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()
}
}
如何使用要在 func2 上使用的 func1 的 return 值顺序执行这 3 个函数,然后当 func2 最终完成时 运行 func3.
我希望我把问题说得够清楚了,但话又说回来,我真的是 RxSwift 的新手,我不知道这些操作是否可行。
这是一个例子...
假设你有以下三个功能:
func func1() -> Observable<Data1>
func func2(_ data: Data1) -> Observable<Data2>
func func3(_ data: Data2) -> Observable<Data3>
那么您可以:
let a = func1()
let b = a.flatMap { func2([=11=]) }
let c = b.flatMap { func3([=11=]) }
或:
let c = func1()
.flatMap { func2([=12=]) }
.flatMap { func3([=12=]) }
就是说,您的 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
。这样更好,因为您可以在它之后进行映射或平面映射,以便在完成后让事情发生。
我是 RxSwift 的新手,所以我遇到了以下问题,假设我有 3 个 Observable 示例函数,它们 return 不同的可观察类型:
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()
}
}
如何使用要在 func2 上使用的 func1 的 return 值顺序执行这 3 个函数,然后当 func2 最终完成时 运行 func3.
我希望我把问题说得够清楚了,但话又说回来,我真的是 RxSwift 的新手,我不知道这些操作是否可行。
这是一个例子...
假设你有以下三个功能:
func func1() -> Observable<Data1>
func func2(_ data: Data1) -> Observable<Data2>
func func3(_ data: Data2) -> Observable<Data3>
那么您可以:
let a = func1()
let b = a.flatMap { func2([=11=]) }
let c = b.flatMap { func3([=11=]) }
或:
let c = func1()
.flatMap { func2([=12=]) }
.flatMap { func3([=12=]) }
就是说,您的 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
。这样更好,因为您可以在它之后进行映射或平面映射,以便在完成后让事情发生。