象老板一样的可观察者— RxSwift简介

现在该开始您的反应式编程之旅了! 您的生活将不再相同。 这是将要发生的事情:我将尝试以可能最有趣,最简单,最令人难忘的方式来解释RxSwift(我已经研究了大约6个月)中的概念。 许多人告诉我他们已经开始学习Rx,但是却找不到继续的时间或精力。

我们开工吧。

你是一条狗。 您的主人可能会或可能不会有食物。 如果他们确实有食物,正在考虑食物,甚至看过食物,那么您想知道! 您想立即知道,以便做出最佳舞蹈动作并打扮迪斯科风格,以便可以吃饭。 这是你的生活,这是你的使命。

使用可观察对象非常像这样。 事情可能会或可能不会发生,当事情发生时,它们可能会有价值,也可能不会。 无论哪种方式,它们都为我们提供了一个可以处理几乎所有类型的类,我们可以对此做出反应。

通常在iOS中,我们将创建一个数据模型,将其放置在某个地方并设置我们的视图。 问题在于,我们希望有机会在数据发生变化时做出响应:某人只是喜欢一个帖子,您的爱犬朋友刚刚发现了一根骨头,或者您可以感觉到自己最大的克星并需要告诉世界:猫。

我们可以通过传统方式实现:我们可以拥有一个委托(可以响应特定事件并处理它们的东西),可以使用通知中心或使用回调。 通过Rx,我们将使用可观察的东西!

在本教程中,我们将以它们的基本形式查看它们,将它们弄乱一些,然后讨论如何使其变得更好。

我们的第一观察

让我们创建一个单视图应用程序,并使用Cocoapods或Carthage将RxSwift导入到我们的项目中。

 导入RxSwift 

想象一下,我们想制作一个翻译应用程序,该应用程序可以说狗叫(最先进,最精致的交流形式)并将其翻译为他们会理解的奇怪的人类声音。 通常,我们只需要创建一个String变量,但是使用Rx时,我们要处理的是Observable,它们实际上是随时间变化的值。 时间很重要,因为我们不知道什么地方或什么时间会改变:

 让dogToSpeechTest = Observable  .just(“ Woof”) 

在这里,我们使用具有”语法的泛型,指定要处理的类型。 我们使用方便的’.just()’方法为可观察对象提供初始值。

我们可能还想向我们理解缓慢的所有者发送一系列消息:

 让dogToSpeakArray = Observable 。from([[“ Get”,“ me”,“ food”]) 

我们使用’.from()’运算符从数组创建事件序列。

关键是,我们实际上可以做什么? 好吧,我们可以订阅它们。 我们会讲出每个单词并在说出来时进行翻译,并更新用户界面!

观察值使我们可以访问以下内容:

– onNext –下一个值已到达,已更改,这里是最新值–就像通知
– onError –出现问题了,您有机会对错误做出回应
– onCompleted-此任务已完成
– onDisposed –我们不再需要对此可观察的订阅,因为它不需要

大多数时候,您只想从“ next”获得值。 每次可观察对象的值之一发生更改(网络调用更新了它们,某些逻辑对其进行了更改),那么如果我们订阅了它们,我们将在“ onNext”函数中将该值作为参数传递。 现在让我们看一下完整订阅:

 让dogToSpeechTest = Observable.just(“ Woof”) 
.subscribe(onNext:{
//我们有下一个树皮
},onError:{barkError in
//出现问题
},onCompleted:{
打印(“ Woof-已完成”)

}){

打印(“处置”)
}

我们再次创建了一个名为goToSpeechTest的变量,并对其进行了订阅。 订阅功能将监听下一个,错误,已完成和已处置的事件。 如果我们有处理程序设置,我们可以在这里对每个响应。 我们真正关心的是OnNext。 我们可以使用它来更新文本,播放声音,将其发送给翻译者或其他任何人。 最好的部分是,在这个变量中就可以了,而不是其他地方的复杂逻辑,我们才刚刚开始!

为了简单起见,我们也可以订阅onNext事件:

 让dogToSpeechTest = Observable.just(“ Woof”) 
.subscribe(onNext:{
//我们有下一个树皮
})

因此,当我们订阅此消息时,内存泄漏的可能性很大。 我们应该保持订阅多久,应该如何处理? 正常的自动引用计数在这里不会为我们提供帮助,因此我们需要处理此订阅。 在Rx land中,我们为此使用DisposeBag。 这只是处理订阅的简单方法。 乍一看可能有点怪异,但挂在那里:


//在类的顶部创建我们的处理包
让disposeBag = DisposeBag()
  //将处置方法添加到链的末尾 
让dogToSpeechTest = Observable.just(“ Woof”)
.subscribe(onNext:{
//我们有下一个树皮
} .disposed(作者:disposeBag)

因此,现在我们有了一个订阅,该订阅将侦听树皮并将其发送给翻译器! 我们还处理了内存泄漏问题,并了解了Rx订阅中的不同事件。 在以下教程中,我们将构建更多实际场景,例如如何将这些场景集成到视图模型中以及如何与整体应用程序架构一起使用。

有关更多信息,请访问www.code-disciple.com