大家好,欢迎来到IT知识分享网。
ReactiveX(简写: Rx) 是一个可以帮助我们简化异步编程的框架。
RxSwift 是 Rx 的 Swift 版本。
将KVO,异步操作 和 流 全部被统一成抽象序列
什么要使用 RxSwift ?
- 复合 – Rx 就是复合的代名词
- 复用 – 因为它易复合
- 清晰 – 因为声明都是不可变更的
- 易用 – 因为它抽象了异步编程,使我们统一了代码风格
- 稳定 – 因为 Rx 是完全通过单元测试的
RxSwift 能够帮助我们做些什么:
Target Action
传统实现方法:
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,这样使得代码逻辑清晰可见。
代理
传统实现方法:
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)
回调也变得十分简单
通知
传统实现方法:
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)
这样几行代码来完成相当复杂的异步操作。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/31251.html