前文ios多个网络恳求之间的处理(OC版)介绍了OC中对于网络恳求的处理。本文浅谈一下RXSwift怎么运用在Swift中。才踏入rx的大门,若有不正确的当地,欢迎咱们在评论区留言和讨论。共同进步。 点击OC版

/post/707889…

前文OC版中介绍的几种方法在swift中相同适用,不过便是替换下API的适用罢了。本文首要介绍RXSwift的运用。

1. 多个网络恳求之间次序履行

eg:这里咱们有一个需求:首先经过用户的账号和密码获取到token,然后经过token获取用户的信息。

1.在没运用rx之前咱们可能会很简略的写出以下代码

咱们先用enum简略封装一个网络恳求。日常开发中的网络需求基本山是异步的,这里为了演示rx的运用,就简略的处理了。

private enum API {
  // 闭包的形式
  /// 获取token
  static func token_clourse(userName: String,
           password: String,
           completed:(String?,Error?) -> ()) {
    print("userName = \(userName),password = \(password),\(Thread.current)")
    completed("09b123123",nil)
  }
  /// 经过token获取用户信息
  static func userInfo_clourse(token: String,
            completed:(String?,Error?) -> ()) {
    completed("用户的信息为xxx",nil)
  }
}

然后咱们在控制器中进行调用:

//能够看到闭包嵌套非常难看,这仅仅是2个闭包。可想而知随着需求的扩展,闭包的嵌套层次可能越来越多
API.token_clourse(userName: "小白不是小白", password: "123456") { token, error in
      guard let token = token else {
        return
      }
      print("token = \(token)")
      API.userInfo_clourse(token: token) { userInfo, error in
        if let userInfo = userInfo {
          print("userInfo = \(userInfo)")
        }
      }
    }

看看成果:

ios多个网络请求之间的处理(Swift版)

2.咱们看看运用了rx后的代码:

首先向刚才的API枚举中增加如下代码:

    // RX
  static func token_rx(userName: String,
           password: String) -> Observable<String> {
        print("userName = \(userName),password = \(password)")
    return Observable.just("09b123123")
  }
  static func userInfo_rx(token: String) -> Observable<String> {
    return Observable.just("用户的信息为xxx")
  }

这里的Observable其实对应了Collection中的Sequence。只不过Observable比Sequence多了能够异步或同步发出event事情的才能。详细解说后续可能会出一期详细文章。

然后咱们在控制器中进行调用:

// 这代码量是不是简练多了,这种函数式编程不仅减少了闭包的嵌套层次,一起让代码阅读起来很舒畅
// 控制器中加一句代码:private let disposeBag = DisposeBag() 
// 垃圾袋,用于回收obsever的。将obsever的声明周期交给垃圾袋,当垃圾袋denit后,其中的内容也就被释放了。
API.token_rx(userName: "小白不是小白", password: "123456")
      .flatMapLatest(API.userInfo_rx)
      .subscribe(
        onNext: {
          print("userInfo = \($0)")
        }
      )
      .disposed(by: disposeBag)

看看成果:

ios多个网络请求之间的处理(Swift版)

2. 多个网络恳求履行完后,在履行其他操作

eg:这里有一个需求:获取到banner的数据和列表的数据后,更新UI。咱们看看怎么运用rx来完结 相同咱们首先向刚才的API枚举中增加如下代码:

// RX
  /// 获取banner的数据
  static func bannerData_rx() -> Observable<[String]> {
    return Observable.just(["banner1","banner2"])
  }
  /// 获取列表的数据
  static func listData_rx() -> Observable<[String]> {
    return Observable.just(["list1","list2"])
  }

然后咱们在控制器中进行调用:

// 经过zip操作符,将两个网络恳求组装成一个新的可观察序列
Observable
       .zip(
        API.bannerData_rx(),
        API.listData_rx()
      )
      .subscribe(
        onNext: {
          print("banners = \($0)\nlist = \($1)")
          DispatchQueue.main.async {
            print("刷新UI")
          }
        }
      )
      .disposed(by: disposeBag)

看看成果:

ios多个网络请求之间的处理(Swift版)