|
|
1
6
好吧,我试试看。 你说“不要单件”,所以我在下面排除了这一点,但请看下面这个答案。 乔希·霍曼的评论已经是一个很好的解决方案的指针,但我个人对协调模式有一些问题。
正如乔希正确地说的那样,视图控制器不应该(太多)了解彼此[1],但是,例如,如何传递/访问协调器或任何依赖项?有几种模式可以建议如何进行,但大多数模式都有一个基本上违背您要求的问题:它们或多或少地使协调器成为一个单例(或者它本身,或者作为另一个单例的属性,比如
我倾向于依靠
简单初始化属性或
(最常)
惰性性质
以及面向协议的编程。让我们构造一个示例:
现在,对访问此数据感兴趣的每个视图控制器都有一个简单的属性:
我将它公开,因为这样我就可以在单元测试中轻松地模拟/存根它(如果我需要这样做,我可以创建一个虚拟的
诀窍
显然是
设计
我知道这是一种逃避的回答,在某种程度上,我只是说描述一种方法,它(至少是其中的一部分)是许多通用模式。然而,我发现这是在swift中处理依赖注入的最通用和最简单的形式。协调模式可以与之正交使用,但我发现它在日常使用中不太像苹果。它确实解决了一个问题,但大多数情况下,你得到的故事板并没有按预期正确地使用(特别是:仅仅将它们用作“vc repos”,从那里实例化它们,然后在代码中转换自己)。
[1]除了一些基本和/或次要的事情,您可以在完成处理程序中传递,或者
作为结束语,“注意,我们要避免单件事”这句话以及你对问题下的评论给我的印象是,你只是按照建议行事,而没有适当考虑理由。我知道“单身”经常被认为是一种反模式,但同样的,判断也经常被误传。单例可以是一个有效的体系结构概念(您可以看到,它在框架和库中被广泛使用)。它的坏处在于它经常诱惑开发人员在设计中使用快捷方式,并将其滥用为一种“对象存储库”,这样他们就不需要考虑何时何地实例化对象。这会导致混乱和模式的坏名声。
一
尤其是如果你不能按照我上面概述的方式来设计它,也就是说。 如果您需要在内存中存储,那么就需要单一的状态数据 一个单件基本上是一个简单的和 适当的 实现这一点的方法。(即使使用(懒惰的)属性也是有益的,那么视图控制器甚至不需要知道它是否是单例的,您仍然可以单独地进行存根/模拟(即,不仅仅是全局实例)。 |
|
|
2
3
这些是我理解的您的要求:
在这些限制条件下,我建议采用以下方法。
定义一个
定义一个
如果状态只需要持续应用程序运行的时间,则可以将状态存储在特定的 实例 但是这个 实例 必须在VC4和VC8之间共享。
在这种情况下,我建议在
如果在应用程序启动之间需要保持状态,或者如果不想通过VCS链传递实例,则可以将状态存储在用户默认值、核心数据、领域或类本身外部的任何数量的地方。
在这种情况下,您可以创建
|
|
|
3
2
首先,我认为你的问题有一个错误的假设。 您可以这样定义VC的层次结构:
然而,在iOS上(除非你使用一些非常奇怪的黑客),总有一个共同的家长在某个点上,像导航控制器,标签栏控制器,主细节控制器或页面视图控制器。 所以我假设一个正确的方案可以看起来像这样:
我相信像这样看着它可以很容易地回答你的问题。 现在,如果你在征求意见,在iOS上处理DI的最佳方法是什么,我会说没有最好的方法。然而,我个人喜欢坚持这样一条规则:对象不应该为自己的创建/初始化负责。这样的事情
毫无疑问。我想要一个需要
这样,您就可以将获取正确模型/服务等的责任传递给实例的创建者,同时您可以使用一个简单但重要的假设来实现您的逻辑,即您拥有所需的一切(或者使类提前失败(例如使用强制解包),这在开发期间实际上是很好的。NT)。 现在,如何获取这些模型——是通过初始化它们、传递它们、拥有一个单独的、使用提供者、容器、协调器等来获取的——这完全取决于您自己,还应该取决于项目的复杂性、客户的需求、您使用的任何工具——所以一般来说,只要您坚持下去,任何工作都是好的。良好的OOP实践。 |
|
|
4
2
下面是我在一些项目中使用的一种方法,可以帮助您。
这里有一个简单的例子:
ViewControllerFactory对象可以实例化并存储在AppDelegate中。 这是最基本的。此外,我还将查看以下内容(另请参阅此处提出了一些好建议的其他答案):
|
|
|
5
0
我发现协调器/路由器设计模式最适合注入依赖项和处理应用程序导航。看看这篇文章,它对我有很大帮助 https://medium.com/@dkw5877/flow-coordinators-333ed64f3dd |
|
|
6
0
我试图解决这个问题,并在这里上传了一个架构示例: https://github.com/ivanovi/DI-demo 为了更清楚地说明这一点,我使用三个VCS简化了实现过程,但该解决方案可以在任何深度下工作。视图控制器链如下: master->详细信息->更多详细信息(插入依赖项的位置) 提议的架构有四个构建块:
注意:在这个例子中,我返回新创建的vc实例只是为了生成这个例子——也就是说,在实际的实现中,不需要返回vc。 希望它有帮助。 |
|
|
7
0
|
|
|
Danil · 种子/填充核心数据的最佳实践?[关闭] 1 年前 |
|
|
Robin · LazyVGrid项目预计不会击中测试区域 1 年前 |
|
|
Alex Smith · 移动到下一个视图控制器后如何显示警报? 1 年前 |
|
selcukctn · 如何在react native中制作无限动画? 1 年前 |
|
|
Nicolas Gimelli · iOS 18远程通信通知不起作用 1 年前 |