Error[8]: Undefined offset: 47, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述<!--more--> 在前一篇基础之上,本文我们将会介绍 RxSwift 中的 Observables 部分。 在 RxSwift 中 Observable 也被称为 Observable Sequence、Sequence、Stream。Observable 会以异步的方式不断的发射事件形成事件流,并且数据也会沿着事件流进行传播。下图是事件流的图像化表示: 其中从左到右的箭头代表时间轴,而三个


<!--more-->

在前一篇基础之上,本文我们将会介绍 RxSwift 中的 Observables 部分。

在 RxSwift 中 Observable 也被称为 Observable Sequence、Sequence、Stream。Observable 会以异步的方式不断的发射事件形成事件流,并且数据也会沿着事件流进行传播。下图是事件流的图像化表示:

其中从左到右的箭头代表时间轴,而三个圆圈则构成了可观察序列。而整个过程会按照从左到右的顺序。另外,事件可能在可观察序列生命周期内的任意时刻被触发。

Observable 生命周期

上图中的三个圆圈其实就是 RxSwift 中的 next 事件。除了 next 之外,RxSwift 中还有 completederror 事件,而这两者都意味事件流生命周期的总结。

completed 所表示的正常终结:

error 所表示的异常终结:

在源码中这三类事件的定义如下:

/// Represents a sequence event.////// Sequence grammar: /// **next\* (error | completed)**public enum Event<Element> {    /// Next element is produced.    case next(Element)    /// Sequence terminated with an error.    case error(Swift.Error)    /// Sequence completed successfully.    case completed}

在代码中,我们可以清晰的看到 next 事件会携带一个实例进行传播,error 事件会携带一个 Error 实例,completed 则什么都不会携带。

新建 Observable

在所有 Observable 对象的创建方法中,最简单的就是 just

// 1let one = 1 let two = 2 let three = 3// 2 let observable: Observable<Int> = Observable<Int>.just(one)

作为类方法 just 所创建的 Observable 对象只会包含一个元素。但是大多数时候,Observable 对象在其生命周期内会包含多个元素,而创建方法也很简单:

let observable2 = Observable.of(one,two,three)

可能上面的代码会给人一种误导,让人觉得 observable2 中的数据可能是一个数组类型。不过好在我们可以通过下面的代码进行检验:

observable2.subscribe(onNext: { element in        print(element)     }) /* 打印结果:123*/

而真正创建数组类型变量的方法是:

let observable3 = Observable.of([one,three])observable3.subscribe(onNext: { element in        print(element)     }) /* 打印结果:[1,2,3]*/

上面只是几个常用的 Observable 创建方法,更多的内容可以去查文档和代码。

订阅 Observable

在日常 iOS 编程中,通知模式可以说是使用频率相当高的一个设计模式。我们通过 NotificationCenter 实现消息的广播和订阅。下面是一个典型的通知模式代码用于处理 UIKeyboardDIDChangeFrame 消息:

let observer = NotificationCenter.default.addobserver( forname: .UIKeyboardDIDChangeFrame,object: nil,queue: nil ) {  notification in     // 闭包}

RxSwift 中的订阅 *** 作也非常简单,只需要调用 subscribe 方法就行了。不过与 NotificationCenter 机制不同的是,RxSwift 中每一个订阅都是唯一的并没有一个类似 default 这样的全局单例对象。

更为重要的是,在没有订阅者的时候 Observable 对象不会发送通知。另外, Observable 对象实际上是一个序列,所以订阅 *** 作有点类似于反复调用 Swift 标准库里中迭代器 Iterator 对象 next 函数:

let sequence = 0..<3var iterator = sequence.makeIterator()while let n = iterator.next() {     print(n)}/* 打印结果: 0 1 2 */

不过 RxSwift 订阅 *** 作明显比这个来的更直接,并且可以一次实现对 nexterrorcompleted 事件的的处理。一个简单的订阅 *** 作示例:

let one = 1 let two = 2 let three = 3let observable = Observable.of(one,three)observable.subscribe { event in     print(event) }

上面代码的订阅 *** 作非常简单:打印出 observable 声明周期内的所有事件。正常情形下,它的结果如下:

next(1) next(2) next(3) completed

当然,有时候我们可能只是需要 observable 所发射的数据:

observable.subscribe { event in    if let element = event.element {         print(element)    }}/* 打印结果:1 2 3*/

又或者,我们需要对不同事件区别处理:

observable .subscribe(    onNext: { element in         print(element)     },onCompleted: {         print("Completed")    })
取消订阅并消除内存泄漏

Observable 对象只有在存在订阅的情形下才会进行数据发送 *** 作,而且会在 errorcompleted 事件触发时结束其生命周期。但是,有时候我们可能需要手动取消订阅并提前终结 Observable 对象的生命。

let observable = Observable.of("A","B","C")let subscription = observable.subscribe { event in    print(event)}

上面代码非常简单这里就不再细诉了,这里我们直接来看取消订阅的 *** 作。其实,取消订阅的 *** 作非常之简单只需一行代码:

subscription.dispose()

当然,手动对每一个订阅对象进行取消 *** 作显然是一件枯燥的工作。所以 RxSwift 为大家提供了一个更为简单的方案。只需在订阅时调用 .adddisposableto() 添加一个 disposeBag 类型对象,我们就能在 disposeBag 对象销毁时取消所有绑定订阅对象的取消动作。

let disposeBag = disposeBag()Observable.of("A","C")    .subscribe {         3 print(dispose())    }     .adddisposableto(disposeBag)

这里我们之所以需要进行 disposeBag 对象绑定或者手动调用 empty 进行取消订阅 *** 作,是因为如果不这么做的话 Observable 对象在生命周期完结时会存在内存泄漏的问题。

总结

本文只是简单的介绍了 Observables 一些常见基础内容。这里还有很多更深入的内容没有介绍,例如:neverCreate 类型的订阅、使用 [+++] 实现自定义 Observable 以及 Error 类型的自定义实现。如果你有兴趣的话,我强烈建议你查阅官方文档和代码。

原文地址

总结

以上是内存溢出为你收集整理的RxSwift 之 Observable全部内容,希望文章能够帮你解决RxSwift 之 Observable所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
RxSwift 之 Observable_app_内存溢出

RxSwift 之 Observable

RxSwift 之 Observable,第1张

概述<!--more--> 在前一篇基础之上,本文我们将会介绍 RxSwift 中的 Observables 部分。 在 RxSwift 中 Observable 也被称为 Observable Sequence、Sequence、Stream。Observable 会以异步的方式不断的发射事件形成事件流,并且数据也会沿着事件流进行传播。下图是事件流的图像化表示: 其中从左到右的箭头代表时间轴,而三个


<!--more-->

在前一篇基础之上,本文我们将会介绍 RxSwift 中的 Observables 部分。

在 RxSwift 中 Observable 也被称为 Observable Sequence、Sequence、Stream。Observable 会以异步的方式不断的发射事件形成事件流,并且数据也会沿着事件流进行传播。下图是事件流的图像化表示:

其中从左到右的箭头代表时间轴,而三个圆圈则构成了可观察序列。而整个过程会按照从左到右的顺序。另外,事件可能在可观察序列生命周期内的任意时刻被触发。

Observable 生命周期

上图中的三个圆圈其实就是 RxSwift 中的 next 事件。除了 next 之外,RxSwift 中还有 completederror 事件,而这两者都意味事件流生命周期的总结。

completed 所表示的正常终结:

error 所表示的异常终结:

在源码中这三类事件的定义如下:

/// Represents a sequence event.////// Sequence grammar: /// **next\* (error | completed)**public enum Event<Element> {    /// Next element is produced.    case next(Element)    /// Sequence terminated with an error.    case error(Swift.Error)    /// Sequence completed successfully.    case completed}

在代码中,我们可以清晰的看到 next 事件会携带一个实例进行传播,error 事件会携带一个 Error 实例,completed 则什么都不会携带。

新建 Observable

在所有 Observable 对象的创建方法中,最简单的就是 just

// 1let one = 1 let two = 2 let three = 3// 2 let observable: Observable<Int> = Observable<Int>.just(one)

作为类方法 just 所创建的 Observable 对象只会包含一个元素。但是大多数时候,Observable 对象在其生命周期内会包含多个元素,而创建方法也很简单:

let observable2 = Observable.of(one,two,three)

可能上面的代码会给人一种误导,让人觉得 observable2 中的数据可能是一个数组类型。不过好在我们可以通过下面的代码进行检验:

observable2.subscribe(onNext: { element in        print(element)     }) /* 打印结果:123*/

而真正创建数组类型变量的方法是:

let observable3 = Observable.of([one,three])observable3.subscribe(onNext: { element in        print(element)     }) /* 打印结果:[1,2,3]*/

上面只是几个常用的 Observable 创建方法,更多的内容可以去查文档和代码。

订阅 Observable

在日常 iOS 编程中,通知模式可以说是使用频率相当高的一个设计模式。我们通过 NotificationCenter 实现消息的广播和订阅。下面是一个典型的通知模式代码用于处理 UIKeyboardDIDChangeFrame 消息:

let observer = NotificationCenter.default.addobserver( forname: .UIKeyboardDIDChangeFrame,object: nil,queue: nil ) {  notification in     // 闭包}

RxSwift 中的订阅 *** 作也非常简单,只需要调用 subscribe 方法就行了。不过与 NotificationCenter 机制不同的是,RxSwift 中每一个订阅都是唯一的并没有一个类似 default 这样的全局单例对象。

更为重要的是,在没有订阅者的时候 Observable 对象不会发送通知。另外, Observable 对象实际上是一个序列,所以订阅 *** 作有点类似于反复调用 Swift 标准库里中迭代器 Iterator 对象 next 函数:

let sequence = 0..<3var iterator = sequence.makeIterator()while let n = iterator.next() {     print(n)}/* 打印结果: 0 1 2 */

不过 RxSwift 订阅 *** 作明显比这个来的更直接,并且可以一次实现对 nexterrorcompleted 事件的的处理。一个简单的订阅 *** 作示例:

let one = 1 let two = 2 let three = 3let observable = Observable.of(one,three)observable.subscribe { event in     print(event) }

上面代码的订阅 *** 作非常简单:打印出 observable 声明周期内的所有事件。正常情形下,它的结果如下:

next(1) next(2) next(3) completed

当然,有时候我们可能只是需要 observable 所发射的数据:

observable.subscribe { event in    if let element = event.element {         print(element)    }}/* 打印结果:1 2 3*/

又或者,我们需要对不同事件区别处理:

observable .subscribe(    onNext: { element in         print(element)     },onCompleted: {         print("Completed")    })
取消订阅并消除内存泄漏

Observable 对象只有在存在订阅的情形下才会进行数据发送 *** 作,而且会在 errorcompleted 事件触发时结束其生命周期。但是,有时候我们可能需要手动取消订阅并提前终结 Observable 对象的生命。

let observable = Observable.of("A","B","C")let subscription = observable.subscribe { event in    print(event)}

上面代码非常简单这里就不再细诉了,这里我们直接来看取消订阅的 *** 作。其实,取消订阅的 *** 作非常之简单只需一行代码:

subscription.dispose()

当然,手动对每一个订阅对象进行取消 *** 作显然是一件枯燥的工作。所以 RxSwift 为大家提供了一个更为简单的方案。只需在订阅时调用 .adddisposableto() 添加一个 disposeBag 类型对象,我们就能在 disposeBag 对象销毁时取消所有绑定订阅对象的取消动作。

let disposeBag = disposeBag()Observable.of("A","C")    .subscribe {         3 print(dispose())    }     .adddisposableto(disposeBag)

这里我们之所以需要进行 disposeBag 对象绑定或者手动调用 empty 进行取消订阅 *** 作,是因为如果不这么做的话 Observable 对象在生命周期完结时会存在内存泄漏的问题。

总结

本文只是简单的介绍了 Observables 一些常见基础内容。这里还有很多更深入的内容没有介绍,例如:neverCreate 类型的订阅、使用 实现自定义 Observable 以及 Error 类型的自定义实现。如果你有兴趣的话,我强烈建议你查阅官方文档和代码。

原文地址

总结

以上是内存溢出为你收集整理的RxSwift 之 Observable全部内容,希望文章能够帮你解决RxSwift 之 Observable所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1058675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存