问题标签 [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 投票
3 回答
11221 浏览

ios - 关于 VIPER - 清洁架构的问题

我一直在阅读 Robert Martin 的关于Clean Architecture的文章,尤其是关于VIPER的文章。

然后我遇到了这篇文章/post Brigade's Experience Using an MVC Alternative,它几乎描述了我目前正在做的事情。

在实际尝试在一个新的 iOS 项目上实现 VIPER 之后,我遇到了一些问题:

  • 演示者可以在视图中查询信息还是“信息传递”始终从视图开始?例如,如果视图在演示者中触发了某些操作,但是根据通过该操作传递的参数,演示者可能需要更多信息。我的意思是:用户点击“doneWithState:”,如果 state == “something”,从视图中获取信息以创建实体,如果 state == “something else”,则在视图中设置动画。我应该如何处理这种情况?
  • 假设一个“模块”(VIPER 组件组)决定以模态方式呈现另一个模块。谁应该负责决定是否以模态方式呈现第二个模块,第一个模块的线框还是第二个模块的线框?
  • 另外,假设第二个模块的视图被推入导航控制器,应该如何处理“后退”操作?我是否应该在第二个模块的视图控制器中手动设置一个带有动作的“后退”按钮,该按钮调用演示者,调用第二个模块的线框以解除并告诉第一个模块的线框它已被解除,以便第一个模块的视图控制器可能想要展示一些东西?
  • 不同的模块应该只通过线框对话还是通过演示者之间的委托进行对话?例如,如果应用程序导航到不同的模块,但之后用户按下“取消”或“保存”并且该选择需要返回并更改第一个模块中的某些内容(可能显示它已保存或删除某些内容的动画)。
  • 假设在地图上选择了一个图钉,而不是显示 PinEditViewController。返回时,所选引脚的颜色可能需要根据 PinEditViewController 上的使用操作进行更改。谁应该保留当前选择的 pin、MapViewController、MapPresenter 或 MapWireframe 的状态,以便我知道,当返回时,哪个 pin 应该改变颜色?
0 投票
3 回答
3767 浏览

ios - UITabBarController 如何适应 VIPER 架构?

我正在编写一个具有基于 TabBar 的导航的应用程序。我正在采用 VIPER 架构,但我真的对应该如何实现 UITabBarController 的选项卡更改的主题感到困惑。

0 投票
2 回答
1507 浏览

ios - Unit Testing an Object and a Variable that conforms to a protocol in Swift

I have a VIPER architecture setup and am trying to unit test the instantiation of the wireframe.

For anyone who doesn't know what VIPER is, the key parts to understand are that there is are 4 classes that that have key responsibilities. The wireframe creates the other 3 (the view, presenter, and interactor). The wireframe then connects them appropriately like below:

So I am creating the unit tests in Swift, and am having difficulty making sure these connections are setup. Note, the code itself works, the asserts in the unit tests are the problem.

Neither of these two asserts compiles correctly.

For the XCTAssertEqual this error occurs

For the XCTAssert (or XCTAssertTrue), this error occurs

For completeness and because someone may find the code useful:

0 投票
0 回答
88 浏览

ios - UITableViewSeparator 仅在使用 VIPER 架构滚动时显示

我有一个奇怪的情况,我UITableViewSeparators只在滚动时出现。我创建了一个非常简单的项目,其中UITableView列出了汽车列表。我使用VIPER建筑。

没有 UITableViewSeparator,只在滚动时显示

我用相关的类创建了一个要点是示例项目。

0 投票
2 回答
663 浏览

ios - iOS 应用 VIPER 架构 - 有多少个数据管理器?

我正在VIPER 架构模式的背景下寻找这个问题的答案-

如果您的应用程序同时与 aweb api和 a对话,databasedataManagers应该拥有一个、两个还是三个?

案子

一个) dataManager

b) APIDataManagerLocalDataManager

c dataManager )APIDataManagerLocalDataManager

在哪里

a)与与您可能拥有的任何服务(远程或本地)interactor对话的单人对话。dataManager

b)知道和信息之间的interactor区别- 并调用或,它们分别与远程和本地服务对话。localremoteAPIDataManagerLocalDataManager

c)interactor唯一与将军交谈,然后将军与dataManager将军dataManager交谈APIDataManagerLocalDataManager

编辑

可能没有明确的解决方案。但任何输入将不胜感激。

0 投票
1 回答
196 浏览

ios - iOS 架构和数据预取

一段时间以来,我一直在寻找一个优雅的解决方案,但并不快乐。

我想要:

  • 解决 VIPER、MVVM 等人解决的大规模视图控制器问题,
  • 始终在完全渲染的屏幕之间设置动画过渡。

这感觉就像与 Apple 框架作斗争;视图控制器位于导航流程的驾驶座上。我正在考虑扭转这种情况并在代码中进行整体导航,但问题是要创建什么样的对象来拥有视图控制器,以及何时实例化。活动指示器将在源场景上。

0 投票
1 回答
1437 浏览

viper-architecture - 如何使用 VIPER 架构设置异步图像加载?

该应用程序的本质是一个 UITableView,当用户向下滚动 tableView 时,它会在每一行显示 UIImages。我应该如何在不破坏 VIPER 架构的情况下将图像加载到单元格中?

上述两种方法似乎都破坏了 VIP,因为没有参与演示者,并且在 VIP 的边界之间没有传递任何结构

您如何建议让 TableView 的 UIImages 进行异步调用以使用 VIP 下载图像(不阻塞主线程)?我可以使调用模式像这样,但我对第 4 步感到困惑:

  1. VC --> interacterOutput.loadImage("someLink")
  2. Interacter --> 完成获取图像的工作,并将 UIimage 发送给演示者
  3. Presenter --> UIImage 已经是正确的 VC 格式,所以将信息传递回 VC
  4. VC --> 我应该如何最好地设置代码,以便单元知道其图像已准备好?我不想重新加载整个 tableView

任何帮助将不胜感激。

0 投票
2 回答
655 浏览

ios - VIPER中UIView动画代码放在哪里?

根据 VIPER 设计模式,UIView 动画代码应该放在哪里?

它应该在视图中还是在演示者中?

笔记:

我有一个CustomView我希望在触摸后在屏幕上移动的东西。

CustomView添加到我的屏幕中ViewController

0 投票
2 回答
1793 浏览

ios - 为什么协议在 VIPER 架构中双向使用而不是单向使用

我们想将我的架构从 MVC 更改为 VIPER。我按照http://mutualmobile.github.io/blog/2013/12/04/viper-introduction/阅读了基本教程

源代码链接:https ://github.com/mutualmobile/Counter

来自视图控制器的通信 ---> 演示者是通过预设器的对象和演示者 --- > 视图控制器通过委托(协议)。我认为这是为了避免保留周期。

但我还浏览了另一个教程https://www.objc.io/issues/13-architecture/viper/ 源代码链接:https ://github.com/objcio/issue-13-viper

他在 VTDListWireframe 中仅将协议用于两个方向

这里

1)双向使用协议有什么好处?

2)我观察到两个协议引用在两个类中都具有强属性声明。它不会导致保留周期吗?

0 投票
2 回答
579 浏览

ios - 阻止回调或协议在 VIPER 中的 DataManager 和 Interactor 之间传递信息?

在使用架构模式时,使用Objective-Cwhich 是传递对象的首选方法DataManagerInteractorVIPER

特别是使用Block Based Callbacksvs. aDataManager Output Protocol

VIPER上最初的 Mutual Mobile 文章中示例待办事项应用程序

Block Based Callbacks像这样使用

- (void)todoItemsBetweenStartDate:(NSDate *)startDate endDate:(NSDate *)endDate completionBlock:(void (^)(NSArray *todoItems))completionBlock;

而来自 Brigade Engineering 的这种方法

利用OutputProtocol一个DataManager

[self.interactor foundUser:user];

哪种方法更好,为什么?

注意:我知道在使用 Swift 时,闭包可以使回调方法更简洁。这个问题直接参考了Objective-C。