ViewModelOwners
两个协议简化了 MVVM 集成,并有助于管理副作用订阅。
- 不需要创建
viewModel
属性 - 如果程序员忘记使用 setter 注入设置
viewModel
(适用于Reusable
视图),则无需处理null
状态 - 自动管理订阅(通过
Disposable
容器) - 一致的架构/副作用设计,为有用的开发工具打开了大门
class MyViewController: UIViewController, NonReusableViewModelOwner {
func didSetViewModel(_ vm: MyViewModelProtocol, disposeBag: DisposeBag) {
...
}
}
要求
- iOS 8.0+ / Mac OS X 10.10+ / tvOS 9.0+ / watchOS 2.0+
- Xcode 10.0+
安装
依赖管理器
CocoaPods
CocoaPods 是 Cocoa项目的依赖管理器。您可以通过以下命令安装它
$ gem install cocoapods
要使用 CocoaPods 将 ViewModelOwners 集成到您的 Xcode 项目中,请在 Podfile
中指定它
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
pod 'ViewModelOwners', '~> 1.0.0'
然后,运行以下命令
$ pod install
Carthage
Carthage 是一个去中心化的依赖管理器,可自动将框架添加到您的 Cocoa 应用程序中。
您可以使用以下命令通过 Homebrew 安装 Carthage:
$ brew update
$ brew install carthage
要使用 Carthage 将 ViewModelOwners 集成到您的 Xcode 项目中,请在其 Cartfile
中指定它。
github "krzysztofzablocki/ViewModelOwners" ~> 1.0.0
手动方式
如果您不希望使用上述任何依赖项管理器,可以手动将 ViewModelOwners 集成到项目中。
Git 子模块
- 打开终端,
cd
到您的顶级项目目录,并运行以下命令 "if" 您的项目尚未初始化为 Git 仓库:
$ git init
- 通过运行以下命令将 ViewModelOwners 添加为 Git 子模块:
$ git submodule add https://github.com/krzysztofzablocki/ViewModelOwners.git
$ git submodule update --init --recursive
-
打开新的
ViewModelOwners
文件夹,并将ViewModelOwners.xcodeproj
拖到 Xcode 项目导航器中的应用程序项目下。它应该出现在您应用程序蓝色项目图标下方。它是在所有其他 Xcode 组之上还是之下无关紧要。
-
在项目导航器中选择
ViewModelOwners.xcodeproj
并验证其部署目标是否与应用程序目标相同。 -
接下来,在项目导航器中选择您的应用程序项目(蓝色项目图标)以导航到目标配置窗口,然后在侧边栏的“目标”标题下选择应用程序目标。
-
在窗口顶部的选项卡栏中打开“常规”面板。
-
在“嵌入的二进制文件”部分下点击
+
按钮。 -
您将看到两个不同的
ViewModelOwners.xcodeproj
文件夹,每个文件夹内部都包含两个不同版本的ViewModelOwners.framework
,它们位于一个Products
文件夹中。您可以选择任意一个
Products
文件夹,这并不重要。 -
选择
ViewModelOwners.framework
。 -
就这样!
ViewModelOwners.framework
自动添加为目标依赖项,链接框架和嵌入框架,在文件复制构建阶段,这是在模拟器和设备上构建所需的所有内容。
嵌入的二进制文件
- 从 https://github.com/krzysztofzablocki/ViewModelOwners/releases 下载最新版本。
- 接下来,在项目导航器中选择您的应用程序项目(蓝色项目图标)以导航到目标配置窗口,然后在侧边栏的“目标”标题下选择应用程序目标。
- 在窗口顶部的选项卡栏中打开“常规”面板。
- 在“嵌入的二进制文件”部分下点击
+
按钮。 - 添加下载的
ViewModelOwners.framework
。 - 就这样!
集成
RxSwift
只需在项目中的任何位置添加此代码即可使 Swift 满意
extension DisposeBag: ViewModelOwnerDisposeBagProtocol {
private final class DisposableWrapper: Disposable {
let disposable: ViewModelOwnerDisposable
init(_ disposable: ViewModelOwnerDisposable) {
self.disposable = disposable
}
func dispose() {
disposable.dispose()
}
}
public func add(_ disposable: ViewModelOwnerDisposable) {
insert(DisposableWrapper(disposable: disposable))
}
}
现在您可以使用 ViewModelOwners 与 RxSwift
处理器一起使用了
func didSetViewModel(_ viewModel: ViewModel, disposeBag: DisposeBag) {
ReactiveSwift
只需在项目中的任何位置添加此代码即可使 Swift 满意
extension CompositeDisposable: ViewModelOwnerManualDisposeBagProtocol {
private final class Wrapper: Disposable {
var isDisposed: Bool
let disposable: ViewModelOwnerDisposable
init(_ disposable: ViewModelOwnerDisposable) {
self.disposable = disposable
isDisposed = false
}
func dispose() {
disposable.dispose()
isDisposed = true
}
}
public func add(_ disposable: ViewModelOwnerDisposable) {
add(Wrapper(disposable))
}
}
现在您可以使用 ViewModelOwners 与 ReactiveSwift
一起使用了
func didSetViewModel(_ viewModel: ViewModel, disposeBag: CompositeDisposable) {
其他库
您只需将 LibraryDisposeBag
对象符合到 ViewModelOwnerManualDisposeBagProtocol
或 ViewModelOwnerManualDisposeBagProtocol
之一。
注意:如果您的 DisposeBag
容器在 dealloc 上没有自动释放,请使用 manual
变体。:
您可以在代码中使用它
func didSetViewModel(_ viewModel: ViewModel, disposeBag: LibraryDisposeBag) {
使用
贡献
欢迎提交问题和拉取请求!
作者
克日什托夫·扎布洛茨基 @merowing_
许可协议
ViewModelOwners基于MIT许可协议发布。详细信息请见LICENSE。