什么是Hanson?
汉森是一个简单的、轻量级的库,用于在Swift中观察和绑定值。它被开发出来以支持我们Blendle iOS应用中的MVVM架构。Hanson在使用KVO时提供了几个优点,如更简洁的语法、无需样板代码以及在纯Swift类型中使用它的能力。
使用示例
最基本的使用案例是简单地观察一个Observable
的变化
let observable = Observable("Hello World")
observe(observable) { event in
// Invoked whenever observable.value is set.
print("Value changed from \(event.oldValue) to \(event.newValue)")
}
汉森还提供KVO的包装器,因此您可以这样观察UITextField
的text
属性的变化
let textField = UITextField()
let textFieldObservable = textField.dynamicObservable(keyPath: #keyPath(UITextField.text), type: String.self)
observe(textFieldObservable) { event in
print("Text field value changed from \(event.oldValue) to \(event.newValue)")
}
此外,您还可以使用汉森将一个可观察对象绑定到另一个可观察对象。假设我们有一个负责加载数据的数据模型,我们希望视图在数据模型加载数据时显示活动指示器
class ViewModel {
let isLoadingData = Observable(false)
}
class View {
let showsActivityIndicator = Observable(false)
}
let viewModel = ViewModel()
let view = View()
bind(viewModel.isLoadingData, to: view.showsActivityIndicator)
现在,每当数据模型的isLoadingData
属性被设置为不同的值时,它将自动设置为视图的showsActivityIndicator
属性。
绑定也支持从KVO支持的观察对象进行。为了将文本框的内容绑定到标签
let textField = UITextField()
let textFieldObservable = textField.dynamicObservable(keyPath: #keyPath(UITextField.text), type: String.self)
let label = UILabel()
let labelObservable = label.dynamicObservable(keyPath: #keyPath(UILabel.text), type: String.self)
bind(textFieldObservable, to: labelObservable)
如果您想自己处理绑定,您还可以提供一个闭包,当应该设置新值时,该闭包将被调用。以下示例中,我们将绑定一个isLoadingData
可观察对象到一个UIActivityIndicatorView
let isLoadingData = Observable(false)
let activityIndicatorView = UIActivityIndicatorView()
bind(isLoadingData, to: activityIndicatorView) { activityIndicatorView, isLoadingData in
if isLoadingData {
activityIndicatorView.startAnimating()
} else {
activityIndicatorView.stopAnimating()
}
}
汉森也支持观察通过 NotificationCenter
发送的通知。例如,观察应用进入后台时的情况。
let observable = NotificationCenter.default.observable(for: Notification.Name.UIApplicationDidEnterBackground)
observe(observable) { notification in
print("Application did enter background")
}
调度器
调度器可以用来安排观察中的事件。默认情况下,汉森使用 CurrentThreadScheduler
,它会立即在任何当前线程上发送事件。汉森还提供了 MainThreadScheduler
,确保事件在主线程上发送。这在观察可能从后台线程更改的值时非常有用,您想根据该值进行 UI 更改。例如
let observable = Observable("Hello World")
observe(observable, with: MainThreadScheduler()) { event in
// It's safe to do UI work here without calling DispatchQueue.main.async here
}
performOnBackground {
observable.value = "Hello from a background"
}
在绑定可观察对象时也支持调度器。
let isLoadingData = Observable(true)
let activityIndicatorView = UIActivityIndicatorView()
bind(isLoadingData, with: MainThreadScheduler(), to: activityIndicatorView) { activityIndicatorView, isLoadingData in
// It's safe to do UI work here without calling DispatchQueue.main.async here
}
performOnBackground {
isLoadingData.value = false
}
您可以通过实现 EventScheduler
协议来创建自己的调度器。
要求
- iOS 8.0+ / macOS 10.9+ / tvOS 9.0+
- Xcode 8
安装
汉森可以通过 CocoaPods 或 Carthage 获取。
CocoaPods
- 将
pod 'Hanson'
添加到您的Podfile
文件中。 - 运行
pod install
。
Carthage
- 将
github 'blendle/Hanson'
添加到您的Cartfile
文件中。 - 运行
carthage update
。 - 按照 Carthage 读取文件 中描述的方法将框架链接到您的目标。
Swift包管理器
- 在Xcode中,选择您的项目并滚动到
框架、库和嵌入式内容
。 - 点击
+
。 - 在打开的框架和库窗口底部,选择
添加其他...
,然后选择添加包依赖...
。 - 将
https://github.com/blendle/Hanson.git
粘贴到搜索文本框中,并按照助手操作。
构建
项目显然可以通过Xcode顺利构建,只需加载Hanson.xcodeproj
并运行。
为了方便,我们包含了一些脚本和一个Makefile
,允许您通过命令行和持续集成构建Hanson。这些脚本灵感来源于GitHub的统御天下脚本模板。
|-- script/
|-- etc/
|-- config.sh # Contains basic configuration parameters
|-- bootstrap # Prepares the project
|-- setup # Sets up the local building process
|-- test # Runs tests locally
|-- cisetup # Sets up the CI building process
|-- citest # Runs tests in a CI environment
开始方法
$ make
跳过设置并立即开始测试
$ make test
在提交拉取请求之前,请确保所有测试都通过。
发布说明
更改列表请参阅CHANGELOG.md。
许可证
Hanson是以ISC许可证发布的。有关详细信息,请参阅LICENSE。