Swift中的反应式编程和绑定
认识Bond和ReactiveKit
移动应用程序消费者在浏览应用程序时提高了他们的期望标准。 如今,每个人都希望看到平滑的过渡,完美的像素应用程序和更少的步骤。 即使是很小的视觉干扰,也会使用户删除您的应用程序。 换句话说, 您的应用必须完美 。
您如何处理数据更改?
还有另一件事,那就是您如何处理UI的数据更改 。 我遇到了大量处理数据更改的应用程序。 例如,您要刷新表视图内容,然后突然整个内容消失了,并在2-3秒后重新出现。 在大多数情况下,您将获得与“拉动刷新”之前相同的结果,因此什么都没有真正改变。 听起来很熟悉?
让我们避免这种情况,并通过使用绑定和反应性数据源正确处理数据更改。 ????
反应式编程
对于不熟悉该术语的人来说,反应式编程是一种异步编程范例,它涉及数据流和变化的传播。 例如,对模型的所有更改将自动反映在关联的视图中。 ????
如果您有兴趣了解有关反应式编程的更多信息, 请单击此处 。
绑定绑定
Bond是一个Swift绑定框架,它将绑定概念提升到了一个全新的水平。 它像Swift一样简单,强大,类型安全且具有多种范例。 它通过使用绑定和反应性数据源来简化状态更改。
该库是我一直以来的最爱。 您可以将其附加到所需的任何组件上。 我将通过几个示例向您展示如何使用Bond,以便您了解其工作原理。
安装
对于安装,我正在使用CocoaPods 。 我强烈建议您也这样做。 只需在您的Podfile中添加以下代码,然后运行pod install
即可。????
target 'YOUR_TARGET' do
use_frameworks!
pod 'Bond', '~> 6.4.3'
end
从撰写本文之日起,我就在使用最新版本的框架。 有关版本更改,请 在此处 检查 。
将import Bond
添加到类的顶部,以便可以使用所有Bond方法。
许多iOS应用程序都使用Google Maps。 这是一个非常常见的功能,因此我决定在Google上准备最终指南... theappspace.com
大事记
我将首先向您展示如何摆脱IBAction
的烦人过程,而如何使用Bond的简化方法。
_ = yourButton.reactive.tap.observeNext { print("Button tapped.") }
这将观察您的按钮点击。 它监听touchUpInside
因为它是最常用的事件。 如果要处理其他事件,可以使用:
yourButton.reactive.controlEvents(.touchUpInside).observeNext { e in
print("Button tapped.")
}
另一个示例是观察UITextField
的文本更改。 知道没有针对这种情况的本地方法,Bond为我们提供了一个简单的解决方案。
_ = yourTextField.reactive.text.observeNext { text in
print(text!)
}
现在,让我向您展示将输入的文本简单绑定到UILabel
。 文本将通过使用.map
闭包进行转换,并传播到标签。 $0
是键入的字符串,因此您可以添加所需的任何字符串转换。
yourTextField.reactive.text.map{ $0?.capitalized }.bind(to: yourLabel)
或者,您可以使用上面的示例,但提供一个条件。 假设您需要在某人在文本字段中键入内容时更改按钮的启用状态。
txtField.reactive.text.map { $0!.characters.count != 0 }.bind(to: yourButton.reactive.isEnabled)
可观察的
可观察到的是ReactiveKit Property
类型的信号和类型别名。 每当Observable
状态改变时,将通知观察者。
let animal = Observable("Dog")
animal.observeNext { value in
print("Hi \(value)!")
}
如果从示例中可以看到,只要可观察动物的值发生变化,就会触发一个观察者。 要更改该值,只需调用animal.value="Cat"
。 要将Observable与UI组件绑定,只需使用animal.bind(to: yourLabel)
。
Bond还通过使用bidirectionalBind
支持双向绑定。 这意味着,如果视图值更改,它将更新Observable值,反之亦然。
animal.bidirectionalBind(to: animalTextField.reactive.text)
本教程是关于使用Swift进行Instagram API身份验证的,将教您如何检索ACCESS_TOKEN… theappspace.com
反应性数据源
通过使用反应性数据源,它使我们可以轻松地观察表或集合视图中的更改。 这意味着只要数组发生更改,数据源方法就会自动更新。 无需在每次更改数组时都添加reloadData()
,它只会更新所做的更改。 ????????????
我们需要使用MutableObservableArray
或ObservableArray
来观察更改并将更改自动传递给数据源方法。
let array = MutableObservableArray([“John”,”Michael”,”Steven”])
现在,我将向您介绍实现表视图的数据源有多么容易和简短。 您不需要将UITableViewDataSource与表视图连接,因为Bond为我们处理了该操作。
强制的numberOfRowsInSection()
和cellForRowAtIndexPath()
在数组bind()
方法下“打包”。 在最后,您可以添加自己的单元格逻辑。 请参见下面的示例。 ????
array.bind(to: tableView, animated: true) { dataSource, indexPath, tableView in
let cell = UITableViewCell(style: .subtitle, reuseIdentifier: “cell”)
cell.textLabel?.text = dataSource[indexPath.row]
return cell
}
现在,假设需要更新数组。 在这一点上,我们只需要关注array ,而忽略表视图以及它是否将要更新。
以下是一些可用于更改数组的方法。
array.append("Brad") /* appends array with a new object */
array.insert("Brad", at: 2) /* inserts new object at the given index */
array.replace(with: [“John”,"Brad",”Michael”,”Steven”], performDiff: true) /* replaces the array but updates only rows that weren't present in the previous array (in our case index 1) */
array.moveItem(from: 1, to: 2) /* items in array will change places */
array.remove(at: 2) /* removes an item from the array */
array[1] = "David" /* replaces the value at the given index */
通过正确使用这些方法,我们可以提供最佳的用户体验。 数据将被更新,并且用户不会以任何方式分心。
我仅介绍了Bond提供的许多功能中的几个。 绑定和响应式范例可以使您的应用程序更上一层楼,因此我强烈建议您使用这种方法。 如果您想传播信息,请不要忘记to或分享这个故事。
感谢您的关注! ????
查看我最新的项目:
阅读我在Medium上撰写的更多文章:
许多iOS应用程序都使用Google Maps。 这是一个非常常见的功能,因此我决定在... medium.freecodecamp.org 上准备最终指南。
订阅我的时事通讯:
From: https://hackernoon.com/bindings-and-reactive-data-sources-in-swift-ee1208f882c9