8. RxSwift 生态系统 - 图1 RxSwift 生态系统

书写 或 collectionView 的数据源是一件非常繁琐的事情,有一大堆的代理方法需要被执行。 RxDataSources 可以帮助你简化这一过程。你可以用它来布局多层级的列表页,并且它还可以提供动画支持。

你只需要几行代码就可以布局一个多 SectiontabelView

你可以点击 来了解更多信息。


Alamofire 是一个非常流行的网络请求框架。 是用 RxSwift 封装的 。它使得网络请求调用变得更加平滑,处理请求结果变得更简洁,更高效:

  1. let stringURL = ""
  2. // 使用 NSURLSession
  3. let session = NSURLSession.sharedSession()
  4. _ = session.rx
  5. .json(.get, stringURL)
  6. .observeOn(MainScheduler.instance)
  7. .subscribe { print($0) }
  8. // 使用 Alamofire 引擎
  9. _ = json(.get, stringURL)
  10. .observeOn(MainScheduler.instance)
  11. // 使用 Alamofire manager
  12. let manager = Manager.sharedInstance
  13. _ = manager.rx.json(.get, stringURL)
  14. .observeOn(MainScheduler.instance)
  15. .subscribe { print($0) }
  16. // URLHTTPResponse + Validation + String
  17. .flatMap {
  18. $0
  19. .validate(statusCode: 200 ..< 300)
  20. .validate(contentType: ["text/json"])
  21. .rx.string()
  22. }
  23. .observeOn(MainScheduler.instance)
  24. .subscribe { print($0) }

你可以点击 RxAlamofire 来了解更多信息。


是一个十分前卫的跨平台数据库,他想要替换 Core DataSQLiteRxRealm 是用 封装的 Realm。它使我们可以用 Rx 的方式监听数据变化,或者将数据写入数据库。

监听数据:

  1. let realm = try! Realm()
  2. let messages = [Message("hello"), Message("world")]
  3. Observable.from(messages)
  4. .subscribe(realm.rx.add())

删除数据:

你可以点击 来了解更多信息。


ReactiveX 生态系统" class="reference-link">8. RxSwift 生态系统 - 图2 ReactiveX 生态系统

我们之前提到过 是 RxSwift 版本。而 (简写: Rx)是一个跨平台框架。它不仅可以用来写 iOS ,你还可以用它来写 AndroidWeb 前端后台。并且每个平台都和 RxSwift 一样有一套 Rx 生态系统。 支持多种编程语言,如:Swift,Java,JS,C#,Scala,Kotlin,Go 等。只要你掌握了其中一门语言,你很容易就能够熟悉其他的语言。

RxJavaAndroid 平台上非常流行的响应式编程框架,它也是 的 Java 版本。

我们还是用输入验证来做演示:

iOS(RxSwift) 版:

  1. ...
  2. let usernameValid = usernameOutlet.rx.text.orEmpty
  3. .map { $0.characters.count >= minimalUsernameLength }
  4. .share(replay: 1)
  5. let passwordValid = passwordOutlet.rx.text.orEmpty
  6. .map { $0.characters.count >= minimalPasswordLength }
  7. .share(replay: 1)
  8. let everythingValid = Observable
  9. .share(replay: 1)
  10. usernameValid
  11. .bind(to: passwordOutlet.rx.isEnabled)
  12. usernameValid
  13. .bind(to: usernameValidOutlet.rx.isHidden)
  14. .disposed(by: disposeBag)
  15. passwordValid
  16. .bind(to: passwordValidOutlet.rx.isHidden)
  17. .disposed(by: disposeBag)
  18. everythingValid
  19. .bind(to: doSomethingOutlet.rx.isEnabled)
  20. .disposed(by: disposeBag)
  21. ...

Android(RxJava) 版:

这两段代码的逻辑是一样的,一个是 iOS(RxSwift) 版本,另一个是 Android(RxJava) 版本。仔细对比以后,你会发现它们的书写方式都是差不多的。


Web 前端

Web 前端 平台上非常流行的响应式编程框架,它也是 RxJS 版本。而且主流的前端框架都提供了 支持,如:jQuery,,AngularJS,等。

下面这个例子是用 RxJS 写的,它和 GitHub 搜索 十分相似,只不过他搜索的是维基百科:

  1. var $input = $('#input'),
  2. $results = $('#results');
  3. Rx.Observable.fromEvent($input, 'keyup')
  4. .map(e => e.target.value)
  5. .filter(text => text.length > 2)
  6. .throttle(500 /* ms */);
  7. .distinctUntilChanged();
  8. .flatMapLatest(searchWikipedia);
  9. .subscribe(data => {
  10. var res = data[1];
  11. $results.empty();
  12. $.each(res, (_, value) => $('<li>' + value + '</li>').appendTo($results));
  13. }, error => {
  14. $results.empty();

当用户输入一个稳定的关键字后,向维基百科请求搜索结果,然后显示出来。

即便你没有学过 Web 前端开发,但是只要你熟悉 ,以上代码你也能够看懂。


总结

由于 Rx 支持多种后台语言,如:JavaJSGo。所以你也可以用它来写后台。

如果你已经能够熟练使用 ,那么你就已经具有某种“天赋”,这种“天赋”可以帮助你快速上手其他平台。你只需要学习一些和平台相关的知识,就可以写出交互相当复杂的应用程序。因为你的 Rx 技巧是可以跨平台复用的。

另外,你的学习效率也会更高,如果你在 中学到了某些技巧,那么这个技巧通常也可以被应用到 Android 或者其他的平台。如果你在 RxJava 中学到了某些技巧,那么这个技巧通常也可以被应用到 iOS 平台。因此,你的学习资源也就不再局限于 ,你还可以浏览其他平台上关于 Rx 的教程。

下一章将提供一些关于 。