• 自主学习之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的初学者,其中有什么错误,希望大神赐教。

     
  • 相关阅读:
    非常抱歉,全站内容审核中...
    jS代码总结(2)
    timestamp(数据库中的数据类型)
    jS代码总结(1)
    TextWriterTraceListener 和设计时属性支持文件xmta
    validating和validated的区别
    IoC和控制反转
    wince BindingSource
    简单网络传递加密数据
    C#不对称加密
  • 原文地址:https://www.cnblogs.com/melons/p/5791969.html
Copyright © 2020-2023  润新知