设置多个委托以正确传递多个视图控制器?

Setting multiple delegates for passing multiple view controllers right way?

所以我使用多个委托来传递槽数据,但我不知道这是否是正确的方法。我只想维护 1 个主要对象,以确保如果用户 exists/closes 应用程序在不在 VC1 中时保存编辑数据。通过现在使用委托,我确定数据在主对象中并且一切正常。你们能告诉我正确的方向并告诉我这是不是要走的路吗?提前致谢!

VC1:
Main object, holds all data that needs to be saved
Delegate for VC2

VC2:
Specific object overview from VC1
Delegate for VC3
Delegate function called -> PassDataToVC1(editsForSpecificObject)

VC3:
Edit's data from specific object. -> Gives
Delegate function called -> PassDataToVC2(edits)

Maybe even a 4th VC depending what I'm going to do. 

您所做的基本上是正确的对于您选择的体系结构:

  • 如果你有一个规则,只有 VC1 知道完整的数据并可以保存它,那么你需要将数据中的更改传递回 VC1。

  • 如果您规定将数据传回 VC1 的方式是使用协议和委托架构,那么您必须让 VC1 成为您的协议的委托.将单个对象(您的 VC1)扩展为采用多种协议并没有错;这确实是一个标准的 Swift 模式。

但是,我认为您觉得这很丑陋的原因是这些规则不是很好。我将以相反的顺序解决它们:

为什么要委托? 在现代 Swift 中,有更简洁的方式来传递数据。现代应用程序架构通常是 反应式的, 意味着数据处理程序是数据更改的 发布者 ,也是数据的中央存储订阅这些发布者。因此,数据存储可以直接听到任何更改,而视图控制器不必 发送 这些更改 特别是任何人。

为什么要使用视图控制器? 这可以说是您架构中最薄弱的一点。 view 控制器了解 data store 及其保存机制有什么用?你应该有一个单独的数据存储 object 由一些安全持久的对象保留,例如应用程序委托。这个对象存储和看守数据,并且知道(或有一个知道的服务助手)如何持久化它。您可以使用依赖注入将此对象的 reference 传递给每个视图控制器——这还有一个额外的好处,就是让您的代码非常容易测试。更好的是,如果你将这个想法与我在上一段中概述的反应性的使用相结合,你将拥有一个干净的“无接触”架构,可以正常工作,其中每个对象都做自己的工作,而不是其他。