ViewStateCore
ViewController 的问题
在每种提出的模型中,无论是 MVC、MVVM 还是 VIPER,我们都会遇到一个问题。我们的视图控制器变得越来越麻烦。需要存储过多的信息,如输出,引用的对象,显示数据,用户首选项,临时变量等,这变得越来越复杂,尤其是在逻辑开始变得复杂时。一个解决方案是为视图控制器创建一个对象来存储上述信息,并在必要时通知视图控制器以刷新视图。这就是所说的 View State
。
它是如何工作的
View State 解决两个主要任务:
- 通过将它们分组到 VS 中来消除视图控制器中的碎片化
- 在数据更改时提供更新机制
这符合 Clean MVC 的目标,即减少大量视图控制器,解决混乱的视图控制器,并作为单向数据流的最后一块。
View State 基于 KVO 机制,VS 的所有属性都与 Objective C 相关。当 VS 的属性发生变化时,它会向所有订阅它的对象发送通知。View State 支持多级,这意味着 VS 可以包含多个子 VS。最佳实践是我们只有两个级别的 View State。
使用方法
class MovieListState: ViewState {
@objc dynamic var movies: [MovieModel] = []
}
class FilterViewState: ViewState {
@objc dynamic var selectedCategory: String = "Love"
}
class AExampleState: ViewState {
@objc dynamic var movies: MovieListState = MovieListState()
@objc dynamic var search: FilterViewState = FilterViewState()
}
class ViewController: ..., ViewStateSubscriber {
var state = AExampleState()
...
override func viewDidLoad() {
super.viewDidLoad()
state.subscribe(for: self)
}
func viewStateDidChange(newState: ViewState) {
if let _ = newState as? MovieListState {
// refresh views
} else if let _ = newState as? FilterViewState {
// reload data
} else {
// refreshState()
}
}
}
需求
- Xcode 8.3+
- Swift 3+
安装
ViewStateCore通过CocoaPods提供。要安装,只需将以下行添加到您的Podfile中
pod 'ViewStateCore'
作者
congncif, [email protected]
许可证
ViewStateCore采用MIT许可证。有关更多信息,请参阅LICENSE文件