您的位置:首页 > 移动开发 > Swift

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

2016-03-28 10:04 513 查看
最近项目中有这么一个需求,下面是三个网络请求

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的初学者,其中有什么错误,希望大神赐教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: