咱们先看一下 RxSwift 可以帮助咱们作些什么:面试
传统实现方法:算法
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
复制代码
func buttonTapped() {
print("button Tapped")
}
复制代码
经过 Rx 来实现:编程
button.rx.tap
.subscribe(onNext: {
print("button Tapped")
})
.disposed(by: disposeBag)
复制代码
你不须要使用 Target Action,这样使得代码逻辑清晰可见。markdown
传统实现方法:网络
class ViewController: UIViewController {
...
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
}
}
extension ViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
print("contentOffset: \(scrollView.contentOffset)")
}
}
复制代码
经过 Rx 来实现:多线程
class ViewController: UIViewController {
...
override func viewDidLoad() {
super.viewDidLoad()
scrollView.rx.contentOffset
.subscribe(onNext: { contentOffset in
print("contentOffset: \(contentOffset)")
})
.disposed(by: disposeBag)
}
}
复制代码
你不须要书写代理的配置代码,就能得到想要的结果。闭包
传统实现方法:架构
URLSession.shared.dataTask(with: URLRequest(url: url)) {
(data, response, error) in
guard error == nil else {
print("Data Task Error: \(error!)")
return
}
guard let data = data else {
print("Data Task Error: unknown")
return
}
print("Data Task Success with count: \(data.count)")
}.resume()
复制代码
经过 Rx 来实现:并发
URLSession.shared.rx.data(request: URLRequest(url: url))
.subscribe(onNext: { data in
print("Data Task Success with count: \(data.count)")
}, onError: { error in
print("Data Task Error: \(error)")
})
.disposed(by: disposeBag)
复制代码
回调也变得十分简单app
传统实现方法:
var ntfObserver: NSObjectProtocol!
override func viewDidLoad() {
super.viewDidLoad()
ntfObserver = NotificationCenter.default.addObserver(
forName: .UIApplicationWillEnterForeground,
object: nil, queue: nil) { (notification) in
print("Application Will Enter Foreground")
}
}
deinit {
NotificationCenter.default.removeObserver(ntfObserver)
}
复制代码
经过 Rx 来实现:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.rx
.notification(.UIApplicationWillEnterForeground)
.subscribe(onNext: { (notification) in
print("Application Will Enter Foreground")
})
.disposed(by: disposeBag)
}
复制代码
你不须要去管理观察者的生命周期,这样你就有更多精力去关注业务逻辑。
例如,先经过用户名密码取得 Token 而后经过 Token 取得用户信息,
传统实现方法:
/// 用回调的方式封装接口
enum API {
/// 经过用户名密码取得一个 token
static func token(username: String, password: String,
success: (String) -> Void,
failure: (Error) -> Void) { ... }
/// 经过 token 取得用户信息
static func userinfo(token: String,
success: (UserInfo) -> Void,
failure: (Error) -> Void) { ... }
}
复制代码
/// 经过用户名和密码获取用户信息
API.token(username: "beeth0ven", password: "987654321",
success: { token in
API.userInfo(token: token,
success: { userInfo in
print("获取用户信息成功: \(userInfo)")
},
failure: { error in
print("获取用户信息失败: \(error)")
})
},
failure: { error in
print("获取用户信息失败: \(error)")
})
复制代码
经过 Rx 来实现:
/// 用 Rx 封装接口
enum API {
/// 经过用户名密码取得一个 token
static func token(username: String, password: String) -> Observable<String> { ... }
/// 经过 token 取得用户信息
static func userInfo(token: String) -> Observable<UserInfo> { ... }
}
复制代码
/// 经过用户名和密码获取用户信息
API.token(username: "beeth0ven", password: "987654321")
.flatMapLatest(API.userInfo)
.subscribe(onNext: { userInfo in
print("获取用户信息成功: \(userInfo)")
}, onError: { error in
print("获取用户信息失败: \(error)")
})
.disposed(by: disposeBag)
复制代码
这样你能够避免回调地狱,从而使得代码易读,易维护。
例如,须要将两个网络请求合并成一个,
经过 Rx 来实现:
/// 用 Rx 封装接口
enum API {
/// 取得老师的详细信息
static func teacher(teacherId: Int) -> Observable<Teacher> { ... }
/// 取得老师的评论
static func teacherComments(teacherId: Int) -> Observable<[Comment]> { ... }
}
复制代码
/// 同时取得老师信息和老师评论
Observable.zip(
API.teacher(teacherId: teacherId),
API.teacherComments(teacherId: teacherId)
).subscribe(onNext: { (teacher, comments) in
print("获取老师信息成功: \(teacher)")
print("获取老师评论成功: \(comments.count) 条")
}, onError: { error in
print("获取老师信息或评论失败: \(error)")
})
.disposed(by: disposeBag)
复制代码
做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是个人iOS交流圈: 无论你是小白仍是大牛欢迎入驻!! 分享内容包括逆向安防、算法、架构设计、多线程,网络进阶,还有底层、音视频、Flutter等等......
本身根据梳理网络来的的开发经验总结的学习方法,无偿分享给你们。更多资源,须要的话均可以自行来获取下载。 +裙:196800191、 或者是+ WX(XiAZHiGardenia)免费获取! 获取面试资料 简历模板 一块儿交流技术
这样你可用寥寥几行代码来完成至关复杂的异步操做。