日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自主学习之RxSwift(二) -----flatMap

發布時間:2025/4/9 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自主学习之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的初學者,其中有什么錯誤,希望大神賜教。

?

轉載于:https://www.cnblogs.com/melons/p/5791969.html

總結

以上是生活随笔為你收集整理的自主学习之RxSwift(二) -----flatMap的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。