• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Swift中的反应式编程和绑定

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

认识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方法。

大事记

我将首先向您展示如何摆脱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)

反应性数据源

通过使用反应性数据源,它使我们可以轻松地观察表或集合视图中的更改。 这意味着只要数组发生更改,数据源方法就会自动更新。 无需在每次更改数组时都添加reloadData() ,它只会更新所做的更改。 ????????????

我们需要使用MutableObservableArrayObservableArray来观察更改并将更改自动传递给数据源方法。

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上撰写的更多文章:

订阅我的时事通讯:

From: https://hackernoon.com/bindings-and-reactive-data-sources-in-swift-ee1208f882c9


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
swift语法 →闭包表达式发布时间:2022-07-14
下一篇:
Swift&iOS12 获取ssid的问题发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap