自主学习之RxSwift(二) -----flatMap
最近項目中有這么一個需求,下面是三個網絡請求
A.從服務器獲取到時間戳(GET 方法,獲取 timeLine)
B.進行用戶頭像上傳,獲得回傳的URL(POST方法,參數為 userId, timeLine,Image )
C.對用戶信息進行設置(POST方,參數為 timeLine, avatarURL, userId)
對這個情景簡單分析,不難得出一個結論,B依賴于A的返回結果,C依賴于A,B的返回結果,這個時候如果按照我們普通的做法,其實是很麻煩的一件事情,想必大家也都知道該怎么做,下面不妨來看下RxSwift的例子,來看看他到底多強大。
首先是一個網絡請求的方法封裝:(此處以獲取timeLine為例,其他方法基本相同)
? ??func rx_getTimeStamp() -> Observable<AnyObject> {
? ? ? ? return Observable.create({ (observer) -> Disposable in
? ? ? ? ? ? let request = Alamofire.request(.GET, BaseUrl + NetAPI.GetTimeStamp.rawValue)
? ? ? ? ? ? ? ? .responseJSON(completionHandler: { (firedResponse) -> Void in
? ? ? ? ? ? ? ? ? ? if let value = firedResponse.result.value {
? ? ? ? ? ? ? ? ? ? ? ? observer.onNext(value)
? ? ? ? ? ? ? ? ? ? ? ? observer.onCompleted()
? ? ? ? ? ? ? ? ? ? } else if let error = firedResponse.result.error {
? ? ? ? ? ? ? ? ? ? ? ? observer.onError(error)
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? })
? ? ? ? ? ? return AnonymousDisposable{
? ? ? ? ? ? ? ? request.cancel()
? ? ? ? ? ? }
? ? ? ? })
? ? }
其次就是具體代碼的實現
?//從服務器獲取時間戳
? ? ? ? ? ? ? ? let getTimeValue = NetTool.netToolObj.rx_getTimeStamp()
? ? ? ? ? ? ? ? ? ? .map({ value in
? ? ? ? ? ? ? ? ? ? ? ? return JSON(value)["data"]["timestamp"].stringValue
? ? ? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? ? ? .shareReplay(1)
?? ? ? ? ? ? ? ?
?? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? //根據獲取的時間戳,來上傳用戶頭像,將獲取的結果進行解析,得到頭像url
? ? ? ? ? ? ? ? let avatarUrlValue = getTimeValue.flatMap({ timeStamp in
? ? ? ? ? ? ? ? ? ? NetTool.netToolObj.rx_uploadAvatar(NetAPI.Upload.rawValue, image: image!, params:["uid": "5", "timeStamp": timeStamp])
? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? .map({ value in
? ? ? ? ? ? ? ? ? ? ? ? return JSON(value)["data"]["url"].stringValue
? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? .shareReplay(1)
?? ? ? ? ? ? ? ?
?? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? //壓縮 時間戳請求和頭像上傳請求,將獲取到的結果,加入到 設置用戶信息的請求參數中
? ? ? ? ? ? ? ? Observable.zip(getTimeValue, avatarUrlValue, resultSelector: { (timeStamp, avatarUrl)? in
? ? ? ? ? ? ? ? ? ? return self.setParmas(avatarUrl, timeStamp: timeStamp)//(設置字典)
? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? .flatMap({ dict in
? ? ? ? ? ? ? ? ? ? NetTool.netToolObj.rx_netWork(.POST, netType: NetAPI.SetFirstUserInfo, params: dict)
? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? .subscribeNext({ returnObj in
? ? ? ? ? ? ? ? ? ? print(returnObj)
? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? .addDisposableTo(disposeBag)
flatMap,
在此究竟發(fā)揮了什么作用呢,他的返回值是?
Observable<O.E>,因此在此,他聯系了上下的網絡請求,將上一步的結果加入到網絡請求里面,然后再將網絡請求結果,返回為Observable<O.E>,再進行下一次的操作
當然我也是RxSwift的初學者,其中有什么錯誤,希望大神賜教。
?轉載于:https://www.cnblogs.com/melons/p/5791969.html
總結
以上是生活随笔為你收集整理的自主学习之RxSwift(二) -----flatMap的全部內容,希望文章能夠幫你解決所遇到的問題。