问题标签 [viper-architecture]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
467 浏览

ios - 这个 Xcode 项目文件夹层次结构最可能的设计模式是什么?

这是项目文件夹层次结构。我想知道在这种情况下使用什么设计模式。到目前为止,我发现它最有可能是Clean-Swift Architecture (VIP)

未知模式

下面是一个示例 Clean-Swift 项目的文件夹层次结构。

干净迅捷

0 投票
1 回答
358 浏览

swift - 具有通用协议的 VIPER 架构

我有一个关于 VIPER 架构和泛型协议的有趣问题。

看起来 Presenter 和 Interactor 通信很多,(用于获取和接收数据),但 Interactor 的“输出”功能将始终相同

就像是:

如果你有 10 个模块,你将拥有这个函数的 10 倍,而只有 JSONObject 会发生变化......

是否可以使用类似的东西

并在presenter中选择Object的类型?

0 投票
2 回答
187 浏览

ios - 如何在 VIPER 结构中使用委托传输数据

我有两页,第一页是loginPage,另一页是MainViewPage

我想将userInfoUserNamePassword)从第一页转移到第二页,我正在使用 VIPER 结构。

我已经userInfo在第二页得到了,但是当我使用Presenter函数更新UILabelSecondPage,进度被破坏了,它显示以下错误:

线程 1:致命错误:在展开可选值时意外发现 nil。

这是我的Presenter

Presenter两者中的文本都MainView具有价值,但是当它调用updateLabel函数时,进度被破坏了。此存储库中此演示的代码

0 投票
1 回答
54 浏览

ios - 如何在一个屏幕上触发网络请求并最终在 VIPER 架构中获得结果?

我需要调用一个“函数”来进行一些网络请求和数据处理,这可能需要一些时间。

因此,几乎在我的应用程序启动后,我就会调用我的函数,以便在用户到达需要的屏幕时准备好响应。

您将在哪里/如何触发网络请求,以及您将如何通知最终的演示者您得到了响应或没有响应?

0 投票
1 回答
540 浏览

ios - iOS - 在 VIPER 模式上配置自定义 UITableViewCell

我一直在为我当前的iOS (Swift)项目遵循VIPER设计模式,并且我是在代码上使用设计模式的新手。我无法决定自定义或配置. 我是否更改单元格的-> 此委托方法或派生的类实例方法?实际上,这项工作是从模型数据中更改单元格,例如 Label、ImageViewUITableViewCellViewControllerfunc tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCellUITableViewCellIBOutlets

0 投票
1 回答
159 浏览

ios - VIPER 模块依赖项

我一直在从事个人项目,以便更好地了解 VIPER 架构。我真的很喜欢我可以保持模块分离的方式,使代码更干净。

当谈到模块依赖时,我仍然有一些疑问:

我有一个模块负责显示基于用户数据的一些统计数据,另一个模块负责显示基于统计数据的一些数据预测。

然后,我的 ProjectionsInteractor 需要从 StatisticsInteractor 获取一些数据,因为我不想重复实现相同的东西两次。

我已经有一个 DataManager 层,基本上是一个 CoreDataManager,但那里没有任何逻辑。它只是被交互者用来检索和操作一些数据,而不知道关于持久性细节的任何事情。

我应该把从多个交互者中提取出来的共性放在哪里?这有什么不同吗:

  • 共性是否与交互器的核心{数据存储、网络、传感器}数据采集/存储目的相关
  • 共性是否与要对从 {data-store、networking、sensors} 获取的数据执行的业务规则有关?
0 投票
3 回答
280 浏览

ios - Viper 架构中的计时器在哪里

假设我们必须每 10 秒更新一次数据。我们应该在哪里创建/存储计时器,它会在 VIPER 架构中的哪里触发相关方法?ViewController 应该这样做并通知演示者吗?或演示者应该持有计时器?

0 投票
1 回答
305 浏览

ios - 将视图控制器的代码移动到演示者如何更容易在 VIPER 中进行单元测试?

我在VIPER博客中读到,将视图控制器的代码移动到Presenter代码中可以很容易地进行单元测试。博客中给出的原因是其中Presenter没有任何与UIKit相关的代码。

这如何使单元测试更容易。有人可以详细解释一下吗?或者除了避免大规模视图控制器问题之外,还有其他优势吗?

0 投票
1 回答
2461 浏览

ios - 如何在 VIPER 设计模式中将 ViewController 引用传递给路由器?

PS: 这不是一个自以为是的问题。在 VIPER 中连接各种模块是一个合理的疑问。这是一个理论问题,所以没有附加代码。我只需要知道在这种特定情况下我们如何连接 View-Presenter-Router 而不打破基本规则VIPER

我是第一次尝试使用 VIPER。这是我对VIPER的基本理解。

视图:应该显示 UI 控件并捕获IBActions并调用其演示者的委托方法来处理事件

Presenter:将处理所有与 UI 相关的数据,并为渲染准备数据并将数据交还给 View。每当需要屏幕转换时,它都会调用其路由器并要求路由器执行转换

PS: Presenter 中不会有任何 UIComponents。所以没有import UIKit在presenter中声明。

路由器:负责执行屏幕转换,通常在线框的帮助下完成(可选但在应用程序中有这样的类很好)

Interactor:包含所有业务逻辑。Presenter 将在需要基于业务逻辑进行处理时调用 Interactor。

实体: POJO 类(简单的 Swift 对象或核心数据实体)。

现在问题来了:

如果我的假设是正确的,Presenter 应该是一个没有UIKit访问权限的普通 Swift 类。

如果为真,假设我按下了我的一个按钮ViewControllerA并且我需要在其上按下另一个按钮ViewControllerB,显然ViewControllerA会与它交谈PresenterA并告诉它该按钮已被轻按,现在PresenterA应该与它交谈RouterA并告诉它按下ViewControllerB

因为路由器可以访问UIKit我可以轻松地创建一个ViewControllerB使用故事板实例或从 xib 的新实例,但为了推送该实例,我需要 ViewControllerA 的实例。

PresenterA不能持有ViewControllerA对 in 函数的引用或作为参数传递,PresenterA因为UIViewController属于UIKit和 Presenters 不应该有 UI 语句。

我能想到的可能解决方案:

解决方案1:

在创建路由器实例时,将相应ViewController的实例作为其初始化(依赖注入阶段)的一部分传递,这样路由器将始终引用它所属的 ViewController

解决方案2:

让路由器声明其协议并在 ViewController 中实现它,并且每当需要对 ViewController 的引用时,都需要使用路由器的委托。但这与 VIPER 的规则相矛盾,即路由器不应该与 View 通信。

我想得直吗?我的假设是否正确?如果是,解决此问题的正确方法是什么,请建议

0 投票
1 回答
121 浏览

ios - VIPER design pattern in Swift configuring view

I have recently migrated to VIPER and while using this type of architecture came up with such question:

For instance, I have in designs long(2000pt height) UI with over 50 interface elements like labels, buttons, views, collections and so on and I need to add round corners and shadows to them.

Where should I configure its appearance? Should it be in View, or somehow in Presenter?

So far I have extended UIView to create a method to drop shadow.

Right now, what I have in View module is:

Is this a good practice? I'm interested in setting up commonality among the appearance of views as factored out from other methods. It seems more or less clear to me. Thanks in advance.