最近項目中有這麼一個需求,下面是三個網絡請求
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的初學者,其中有什麼錯誤,希望大神賜教。