RxSwift

RxSwiftReactiveX(简写:Rx)是一个可以帮助我们简化异步编程的框架。RxSwift是Rx的Swift版本。将KVO,异步操作和流全部被统一成抽象序列什么要使用RxSwift?复合-Rx就是复合的代名词复用-因为它易复合清晰-因为声明都是不可变更的

大家好,欢迎来到IT知识分享网。RxSwift"

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

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信