我阅读了许多关于干净的iOS架构VIPER的文章,我理解主要的主题:关注点的分离.
我目前用它来做我的项目.我有模块,每个模块由视图,交互者,演示者,实体和路由器(与故事板)分开.
我有一个模块:地址和子模块添加添加地址页面.
所以,我的UIViewController实现了我的协议View.视图控制器保存所有弱IBOutlet标签和文本字段(用于新地址表单).
地址表单包含以下几个字段:
在我的例子中,演示者只是将用户交互依赖于执行API调用的交互器.
但是,在执行API调用之前,我想预先验证表单以避免消耗无用的网络资源.
我需要检查一下例如:
我的问题是,我在哪里可以提交表单验证码?
应该填写哪个VIPER组件?
先感谢您!
我已经在没有太多运气的情况下寻找了答案。这个问题几乎相同,但答案不是很清楚(至少对我来说!): 它是 VIPER 架构中 NSFetchedResultsController 的位置?
NSFetchedResultsController 对于 iOS 应用程序来说似乎是一种非常有用的方法,但是我所看到的所有示例都将其置于 ViewController 层——至少,VC 成为了一个委托。在 Clean Architecture/Viper 中,模型层与视图层非常脱节,我无法弄清楚 NSFRC 在这样的架构中是如何使用的。对上述问题的回答意味着交互器应该是一个委托,但这没有意义——然后托管对象将呈现给交互器,而不是 PONSO。也许我对它的理解还不够好,但是 (a) 它在 Clean Architecture 中占有一席之地吗?(b) 如果是,那么需要正确的 Swift 实现模式吗?
我正在查看 VIPER 架构,我想知道应用程序中的通知会去哪里。我使用 Realm 本地数据库,它能够在模型更新时发送通知。通知是从 INTERACTOR --> PRESENTER --> VIEW 广播的还是从其他地方广播的?
我有一个 VIPER 模块 ( SubjectList
),我想在其中使用更通用的HeaderModule
aSubjectListCollectionModule
和 a BlockModule
。在什么时候我会合乎逻辑地添加HeaderModule
?
我可以包括在模块SubjectListViewModel
,但我还可以使它们在SubjectListView
通过界面生成器,使用实例化它们xibs
。推荐什么?
在阅读了有关此问题的几篇帖子和文章后,我仍然对如何在 VIPER 架构中测试方法(例如使用 Swift)感到困惑。
如果我有这个代码:
演讲者班
protocol InteractorToPresenterProtocol: class {
func showInfo(info: Info)
}
class Presenter {
private var interactor: PresenterToInteractorProtocol?
init() {}
func makeSomeStuffInPresenter() {
// make some stuff
...
interactor?.makeSomeStuffInInteractor()
}
}
extension Presenter : InteractorToPresenterProtocol {
func showInfo(info: Info) {
print(info)
}
}
Run Code Online (Sandbox Code Playgroud)
交互器类:
protocol PresenterToInteractorProtocol: class {
func makeSomeStuffInInteractor()
}
class Interactor {
private var presenter: InteractorToPresenterProtocol?
init() {}
}
extension Interactor : PresenterToInteractorProtocol {
func makeSomeStuffInInteractor() {
// make some stuff
...
presenter?.showInfo(info)
}
} …
Run Code Online (Sandbox Code Playgroud) 应用程序的本质是一个UITableView,当用户向下滚动tableView时,它会在每一行显示UIImages.如何在不破坏VIPER架构的情况下将图像加载到单元格中?
--VC code--
func cellForRowAtIndexPath...... {
var cell = dequeueCellWithIdentifier.....
//Method 1
cell.image = outputInteracter.loadImage("someHttpImageLink")
//Method 2. - using a completion block
outputInteracter.loadImage(anImage -> {
cell.image = anImage
}
}
Run Code Online (Sandbox Code Playgroud)
上述两种方法似乎都打破了VIP,因为演示者没有参与,并且在VIP的边界之间没有传递任何结构
您如何建议使用TableView的UIImages进行异步调用以使用VIP下载图像(不阻止主线程)?我可以让呼叫模式像这样,但我对第4步感到困惑:
任何帮助将不胜感激.
我在VIPER建筑模式的背景下寻找这个问题的答案-
如果你有一个可与既有的应用程序web api
和database
多少dataManagers
,你应该有一个,两个或三个?
案件
一个) dataManager
b) APIDataManager
和LocalDataManager
c) dataManager
,APIDataManager
和LocalDataManager
在哪里
A)的interactor
一个单一的会谈dataManager
,讨论对您的任何服务(远程或本地).
B)该interactor
知道的区别local
和remote
信息-并呼吁无论是APIDataManager
或LocalDataManager
,分别跟远程和本地服务.
c)interactor
与将军的唯一对话dataManager
,将军dataManager
随后与APIDataManager
和将会谈LocalDataManager
编辑
可能没有确定的解决方案.但任何输入都将非常感激.
任何人都可以解释为基于iOS的项目实现MVC vs MVVM与VIPER的真实场景.我正在寻找一些解释我们应该在哪里使用MVC,MVVM和VIPER的示例.
提前致谢.
model-view-controller mvvm cocoa-design-patterns ios viper-architecture
我对 VIPER 架构中协议的好处有点困惑。我了解 DI(依赖注入)通过协议实现,有助于避免对象之间的直接依赖 - 我同意。
但我正在从使用的角度来看真正的好处,一个例子可能是 - 特别是协议如何帮助单元测试(测试交互器部分)受益。
我们不能通过方法回调的 using 块来实现相同的目的吗?希望有人可以通过一些例子帮助我从使用的角度理解
干杯
这是项目文件夹层次结构。我想知道在这种情况下使用了什么设计模式。到目前为止,我发现它最有可能是Clean-Swift Architecture (VIP)。
以下是示例 Clean-Swift 项目的文件夹层次结构。
ios ×8
swift ×5
architecture ×3
viper ×2
core-data ×1
mvvm ×1
objective-c ×1
unit-testing ×1
xcode ×1