MVVM + RxSwift
. MVVM + RxSwift + CTMediatror + MJRefresh + DZNEmptyDataSet
基于 MVVM + RxSwift 搭架构图怎么画建响应式数据绑定基础架构
CatHome
-
资源模块,主要处理架构图片资源和文本资源读取
- 读取图片资源:
R.image("base_black_back")
- 读取文本资源:
R.t架构图怎么画ext("base_empty_timvvm数据双向绑定原理tle")
- 读取颜色资源:
R.color("background")
- 读取图片资源:
BeeBox
- 主要收集RxSwift相关好用方法类等
Adapter
- 该模块主要就是封装基类
- BaseViewController: 支持oc基类swift是什么组织缩写,公共部分
- VMTableViewController: 列表基类, 内部采用响应式处理
-
VMViewController: 该基类继承时需指定
ViewModel
或其子类作为架构师证书泛型,该类会自动懒加载指定类型的VM对象。 -
ViewModel: 基础模型,子类必须继承枸杞使用
- 关于子类,这边目前都采用协议的方式去设计修改,需要什么就导入什么协议即可。
例如:
- 引入上拉和下拉刷新功能
只需要遵循这两个协议即可 - ViewModelHeaderable, ViewModelFooterable
- 引入空数据展示功能
只需要遵循空数据协议 - ViewModelEmptiable
CTMediatror
- 该模块主要解决Swift采用该组件化方案Cocswift翻译oaPods问题
extension CTMediator { /// Swift调度者 func Second_viewController(title: String) -> (UIViewController?) { let params = [ "title": title, kCTMediatorParamsKeySwiftTargetModuleName: "Rickenbacker_Example" ] as [AnyHashable : Any] let viewController = self.performTarget(String(describing: SecondViewController.self), action: "Extension_ViewController", params: params, shouldCacheTarget: false) as? UIViewController return (viewController) } } class Target_SecondViewController: NSObject { /// 备注提示,这里必须加上`@objc` /// 否则会出现找不到该方法从而导致控制器为`nil`问题 @objc func Action_Extension_ViewController(_ params: NSDictionary) -> UIViewController? { guard let title = params["title"] as? String else { return nil } let vc = SecondViewController.init() vc.viewModel = SecondViewModel.init(title: title) return vc } }
HBswift系统DNavigationBar
- 该模块是基于HBDNavigationBar二次封装底层基础导航栏
MJRefresh
该模块是基于MJRefresh封装列表刷新功能
- 注入下拉刷新功能,只需要简单的swift代码实现
Vimvvm和mvc的区别ewModelHeaderable
协议即可 - 注入上拉加载更多功能,只需要简单的实现
ViewModelFoot前端mvvmerable
协议即可
测试用例:
extension MJRefreshViewModel: ViewModelHeaderable, ViewModelFooterable { var enterBeginRefresh: Bool { return false } // 自动无感上拉刷新功能 var footer: MJRefreshFooter { let footer = MJRefreshAutoFooter() footer.triggerAutomaticallyRefreshPercent = -5 return footer } }
备注提示:当然这边你也可以根据你的需求来自定义
header
和footer
final class MJRefreshViewModel: ViewModel {
struct Input {
let headerRefresh: Observable<Void>
let footerRefresh: Observable<Void>
}
struct Output {
let items: Driver<[String]>
}
}
extension MJRefreshViewModel: ViewModelType {
func transform(input: Input) -> Output {
var objects: [String] = []
var page: Int = 1
/// 下拉刷新
let refresh = input.headerRefresh.then(page = 1)
.flatMapLatest {
MJRefreshAPI.refresh(page).request()
}.map { [unowned self] (items) -> [String] in
refreshSubject.onNext(.endHeaderRefresh)
objects = items
return objects
}.asDriver(onErrorJustReturn: [])
/// 上拉加载更多
let more = input.footerRefresh.then(page += 1)
.flatMapLatest {
MJRefreshAPI.refresh(page).request()
}.map { [unowned self] (items) -> [String] in
if items.isEmpty {
refreshSubject.onNext(.endFooterRefreshWithNoData)
} else {
refreshSubject.onNext(.endFooterRefresh)
}
objects += items
return objects
}.asDriver(onErrorJustReturn: [])
/// 数据响应
let items = Driver.of(refresh, more).merge()
/// 空数据绑定
items.map { $0.isEmpty }.asObservable().bind(to: isEmptyData).disposed(by: disposeBag)
return Output(items: items)
}
}
DZNEmmvvm框架ptyDataSetSwift
该模块是基于EmptyDataSet-Swswifterift封装列表空数据展示功能
- 注入空数据展示功能,只需要简单的实mvvm的理解现
Vi工资超过5000怎么扣税ewModelEmpt架构师证书iable
协议
测试用例:
class EmptyViewModel: ViewModel, ViewModelEmptiable, ViewModelHeaderable { let dataSource: BehaviorRelay<[String]> = BehaviorRelay(value: []) func loadData() { let driver = NetworkService().randomResult().asObservable() driver.bind(to: dataSource).disposed(by: disposeBag) driver.map { $0.isEmpty }.bind(to: isEmptyData).disposed(by: disposeBag) driver.subscribe { _ in } onCompleted: { self.refreshSubject.onNext(.endHeaderRefresh) }.disposed(by: disposeBag) } }
let driver = NetworkService().randomResult().asObservable() driver.map { $0.isEmpty }.bind(to: isEmptyData).disposed(by: disposeBag)
这边目前也支持自定义UI展示配置
/// 配置空数据展示信息 extension DZNEmptyDataSetViewController: EmptyDataSetViewable { func setupEmptyView(_ view: EmptyDataSetView) { view.titleLabelString(NSAttributedString(string: R.text("TEXT"))) view.detailLabelString(NSAttributedString(string: R.text("测试网络异常展示"))) view.image(R.image("base_network_error_black")) view.verticalOffset(-200) } }
CocoaPods IGonstall
目前暂时包含如下七大模块:
- 导入项目响应式基类模块:
pod 'Rickenbacker/Adapter'
- 导入资源模块:
pod 'Rickenbacker/CatHome'
- 导入收集模块:
pod 'Ricmvvm与mvckenbacker/BeeBox'
- 导入组件化模块:
podmvvm框架 'Rickenbacker/CTMedmvvm原理iatrswift国际结算系统or'
- 导入导航栏基础模块:
pod 'Rickenba工商银行cker/HBDNavigationBar'
- 导入swift翻译自动刷新模块:
pod 'Rickenbacker/MJRefswift代码resh'
- 导入空数据自动展示模块:
pod 'Rickenbacswift系统ker/DZNEmptyDataSet'
觉得有帮助的老哥们,请帮忙点个星 ⭐..
救救孩子吧,谢谢各位老板。
最后
- 附上传送Rickenbackermvvm的理解Demo 地址.
- 再附上一个开发加速库KJCategoriesDemo地址喜欢的老板们可以点个星
- 最后再附上一个好玩的滤镜框架,有需要的朋友也可以去玩玩,Harbeth
✌️.
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)