前文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)")
}
}
}
看看成果:
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)
看看成果:
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)
看看成果: