微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反应式编程 – .subscribe和.drive之间的区别是什么

我是反应式编程的新手,这是我正在尝试的

.驾驶

searchController.rx.text
        .asDriver()
        .drive(onNext: { (element) in
            print(element)
        }).disposed(by: disposeBag)

.订阅

searchController.rx.text
        .asObservable()
        .subscribe(onNext: { (element) in
            print(element)
        }).disposed(by: disposeBag)

两个块的工作方式完全相同,使用.drive over .subscribe的目的是什么?在哪种情况下我们应该使用.drive over .subscribe?

任何帮助将不胜感激

驱动程序与Observable略有不同.来自文档:

Trait that represents observable sequence with following properties:

  • it never fails
  • it delivers events on MainScheduler.instance
  • share(replay: 1,scope: .whileConnected) sharing strategy

我假设searchController.rx.text永远不会失败,在这种情况下不需要共享.

所以我们只有一点让你的情况与众不同:

  • it delivers events on MainScheduler.instance

你可以自己检查一下.在订阅之前插入此内容并且您的事件将不会在主线程上传递:

.observeOn(ConcurrentdispatchQueueScheduler(qos: .background))

这就是我在我的代码中检查它的方式:

something
    .asObservable()
    .observeOn(ConcurrentdispatchQueueScheduler(qos: .background))
    .subscribe(onNext: { _ in
        print("observable is on main thread: ",Thread.isMainThread)
    })

something
    .asDriver()
    .drive(onNext: { _ in
        print("driver is on main thread: ",Thread.isMainThread)
    })

日志:

driver is on main thread: true

observable is on main thread: false

在哪种情况下我们应该使用.drive:

使用UI时.为什么?来自文档:

Important

Use UIKit classes only from your app’s main thread or main dispatch queue,unless otherwise indicated. This restriction particularly applies to classes derived from UIResponder or that involve manipulating your app’s user interface in any way.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐