【问题标题】:iOS Architecture and Data PrefetchingiOS 架构和数据预取
【发布时间】:2016-03-18 13:55:38
【问题描述】:
一段时间以来,我一直在寻找一个优雅的解决方案,但并不快乐。
我想:
- 解决 VIPER、MVVM 等人解决的大规模视图控制器问题,
- 始终在完全渲染的屏幕之间设置动画过渡。
这感觉就像是在与 Apple 框架作斗争;视图控制器位于导航流程的驾驶座上。我正在考虑扭转这种情况并在代码中进行整体导航,但问题是要创建什么样的对象来拥有视图控制器,以及何时实例化。活动指示器将位于源场景上。
【问题讨论】:
标签:
ios
mvvm
architecture
viper-architecture
【解决方案1】:
不要放弃与 Apple MVC 框架的斗争!
在自己的路由器上拥有模块初始化代码将消除一堆代码重复,特别是对于大型项目。
您需要创建一次这些扩展:
// ReusableView.swift
protocol ReusableView: class {}
extension ReusableView {
static var reuseIdentifier: String {
return String(describing: self)
}
}
// UIViewController.swift
extension UIViewController: ReusableView { }
// UIStoryboard.swift
extension UIStoryboard {
func instantiateViewController() -> T where T: ReusableView {
return instantiateViewController(withIdentifier: T.reuseIdentifier) as! T
}
}
然后,在每个VIPER模块的路由器上留下初始化代码:
// MainSearchRouter.swift
class MainSearchRouter {
// MARK: Properties
weak var view: UIViewController?
// MARK: Static methods
static func setupModule() -> MainSearchViewController {
let viewController = UIStoryboard(name: MainSearchViewController.storyboardName, bundle: nil).instantiateViewController() as MainSearchViewController
let presenter = MainSearchPresenter()
let router = MainSearchRouter()
let interactor = MainSearchInteractor()
viewController.presenter = presenter
presenter.view = viewController
presenter.router = router
presenter.interactor = interactor
router.view = viewController
interactor.output = presenter
return viewController
}
}
这看起来可能需要很多步骤,但好消息是:前面提到的插件也可以自动完成!