// // RQBaseViewModel.m // RQCommon // // Created by 张嵘 on 2018/11/13. // Copyright © 2018 张嵘. All rights reserved. // 所有自定义的视图模型的基类 #import "RQBaseViewModel.h" /// MVVM View /// The base map of 'params' /// The `params` parameter in `-initWithParams:` method. /// Key-Values's key /// 传递唯一ID的key:例如:商品id 用户id... NSString *const RQViewModelIDKey = @"RQViewModelIDKey"; /// 传递导航栏title的key:例如 导航栏的title... NSString *const RQViewModelTitleKey = @"RQViewModelTitleKey"; /// 传递数据模型的key:例如 商品模型的传递 用户模型的传递... NSString *const RQViewModelUtilKey = @"RQViewModelUtilKey"; /// 传递webView Request的key:例如 webView request... NSString *const RQViewModelRequestKey = @"RQViewModelRequestKey"; /// 传递数据的key NSString *const RQViewCommonValueKey = @"RQViewCommonValueKey"; @interface RQBaseViewModel () /// 整个应用的服务层 The `services` parameter in `-initWithServices:params` method. @property (nonatomic, strong, readwrite) id services; /// The `params` parameter in `-initWithServices:params` method. @property (nonatomic, readwrite, copy) NSDictionary *params; /// A RACSubject object, which representing all errors occurred in view model. @property (nonatomic, readwrite, strong) RACSubject *errors; /// The `View` willDisappearSignal @property (nonatomic, readwrite, strong) RACSubject *willDisappearSignal; @end @implementation RQBaseViewModel /// when `BaseViewModel` created and call `initWithParams` method , so we can ` initialize ` + (instancetype)allocWithZone:(struct _NSZone *)zone { RQBaseViewModel *viewModel = [super allocWithZone:zone]; @weakify(viewModel) [[viewModel rac_signalForSelector:@selector(initWithServices:params:)] subscribeNext:^(id x) { @strongify(viewModel) [viewModel initialize]; }]; return viewModel; } /// create `viewModel` instance - (instancetype)initWithServices:(id)services params:(NSDictionary *)params { self = [super init]; if (self) { /// 默认在viewDidLoad里面加载本地和服务器的数据 self.shouldFetchLocalDataOnViewModelInitialize = YES; self.shouldRequestRemoteDataOnViewDidLoad = YES; /// 允许IQKeyboardMananger接管键盘弹出事件 self.keyboardEnable = YES; self.shouldResignOnTouchOutside = YES; self.keyboardDistanceFromTextField = 10.0f; self.title = params[RQViewModelTitleKey]; /// 赋值 self.services = services; self.params = params; } return self; } - (RACSubject *)errors { if (!_errors) _errors = [RACSubject subject]; return _errors; } - (RACSubject *)willDisappearSignal { if (!_willDisappearSignal) _willDisappearSignal = [RACSubject subject]; return _willDisappearSignal; } /// sub class can override - (void)initialize { } @end