MVVM + RxSwift
?. MVVM + RxSwift + CTMediatror + MJRefresh + DZNEmptyDataSet
基于 MVVM + RxSwift 搭建响应式数据绑定基础架构
CatHome
-
资源模块,主要处理图片资源和文本资源读取
- 读取图片资源:
R.image("base_black_back")
- 读取文本资源:
R.text("base_empty_title")
- 读取颜色资源:
R.color("background")
- 读取图片资源:
BeeBox
- 主要收集RxSwift相关好用方法类等
Adapter
- 该模块主要就是封装基类
- BaseViewController: 支持oc基类,公共部分
- VMTableViewController: 列表基类, 内部采用响应式处理
- VMViewController: 该基类继承时需指定
ViewModel
或其子类作为泛型,该类会自动懒加载指定类型的VM对象。 - ViewModel: 基础模型,子类必须继承使用
CTMediatror
- 该模块主要解决Swift采用该组件化方案CocoaPods问题
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
}
}
复制代码
HBDNavigationBar
- 该模块是基于HBDNavigationBar二次封装底层基础导航栏
MJRefresh
- 该模块是基于MJRefresh封装列表刷新功能
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)
}
}
复制代码
DZNEmptyDataSet
- 该模块是基于EmptyDataSet-Swift封装列表空数据展示功能
let driver = NetworkService().randomResult().asObservable()
driver.map { $0.isEmpty }.bind(to: isEmptyData).disposed(by: disposeBag)
复制代码
CocoaPods Install
目前暂时包含如下七大模块:
- 导入项目响应式基类模块:
pod 'Rickenbacker/Adapter'
- 导入资源模块:
pod 'Rickenbacker/CatHome'
- 导入收集模块:
pod 'Rickenbacker/BeeBox'
- 导入组件化模块:
pod 'Rickenbacker/CTMediatror'
- 导入导航栏基础模块:
pod 'Rickenbacker/HBDNavigationBar'
- 导入自动刷新模块:
pod 'Rickenbacker/MJRefresh'
- 导入空数据自动展示模块:
pod 'Rickenbacker/DZNEmptyDataSet'
觉得有帮助的老哥们,请帮忙点个星 ⭐..
救救孩子吧,谢谢各位老板。
?
最后
- 附上传送RickenbackerDemo 地址.
- 再附上一个开发加速库KJCategoriesDemo地址 ?喜欢的老板们可以点个星?
✌️.
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END