自主學習之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,

在此究竟發揮了什麼作用呢,他的返回值是 

Observable<O.E>,因此在此,他聯繫了上下的網絡請求,將上一步的結果加入到網絡請求裏面,然後再將網絡請求結果,返回爲Observable<O.E>,再進行下一次的操作

當然我也是RxSwift的初學者,其中有什麼錯誤,希望大神賜教。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章