Ios 完成处理程序与持有引用:最适合Swift中的这种情况?

Ios 完成处理程序与持有引用:最适合Swift中的这种情况?,ios,swift,closures,completionhandler,Ios,Swift,Closures,Completionhandler,我有以下场景:一个对象A创建一个对象B,该对象应该根据用户的选择执行一些操作A是B的代表A不引用用户所做的选择(由另一个对象C表示),但它在创建B的方法中知道它,它需要知道当对象B完成其任务时选择了哪个选项,并通过调用A实现的相应协议方法来通知该选项 对于这个场景,我想到的第一个解决方案是在a中为选择C提供一个参考,并在B完成时调用的协议方法实现中访问它。但是,通过传递一个完成处理程序来处理这样的选择C,从而避免在a中保留一个引用直到B完成,可能会更好、更“快速” 您如何看待第二种解决方案(将闭

我有以下场景:一个对象
A
创建一个对象
B
,该对象应该根据用户的选择执行一些操作
A
B
的代表
A
不引用用户所做的选择(由另一个对象
C
表示),但它在创建
B
的方法中知道它,它需要知道当对象
B
完成其任务时选择了哪个选项,并通过调用
A
实现的相应协议方法来通知该选项

对于这个场景,我想到的第一个解决方案是在
a
中为选择
C
提供一个参考,并在
B
完成时调用的协议方法实现中访问它。但是,通过传递一个完成处理程序来处理这样的选择
C
,从而避免在
a
中保留一个引用直到
B
完成,可能会更好、更“快速”

您如何看待第二种解决方案(将闭包作为完成处理程序传递给
B
)?它是否比第一种解决方案(在
a
中保留引用)更合适

在这种情况下,我应该如何实现该解决方案?
B
是否应该有一个将闭包称为完成处理程序的引用

编辑:我的场景的一些附加信息:

  • A
    没有确切的属性
    B
    ,它将其推入导航控制器
  • A
    并不总是需要知道
    C
    B
    完成时,它取决于请求
    B
  • A
    只需知道
    C
    一次
    B
    (取决于
    B
    执行的任务,如前所述)即可更新一些数据
  • A
    一次只需要知道一个
    C
    (取决于
    B
    执行的任务,如前所述)

简言之,在您的所有权层次结构中
A
拥有
B
,两个类都使用
C
,您想知道
C
应该归
A
还是
B
所有

您有3个基本选项:

  • A
    B
    own
    C
  • 这意味着
    A
    C
    保存到属性中,在初始化期间将其传递到
    B
    ,并且
    B
    还将
    C
    保存到属性中

  • A
    拥有
    C
  • 这意味着
    A
    C
    保存到属性中,而根本不将其传递给
    B
    B
    在需要时使用委托方法请求它(
    a
    用作
    B
    的数据源)

  • B
    拥有
    C
  • 这意味着
    A
    C
    直接传递到
    B
    B
    使用公共getter将其保存到属性,当
    A
    需要
    C
    时,它从
    B
    读取它

    (请注意,您的想法是第三个选项的变体)

    请注意,这三个选项都与快速性无关,这纯粹是一种架构选择,没有“最佳”解决方案。如果你想决定,你必须考虑你的应用程序的状态,例如:

  • 即使在
    B
    被销毁之后,
    C
    是否应该存在于
    A
    中?如果是,请不要使用第三个选项

  • A
    是否同时处理多个
    B
    C
    ?那么就不要使用第二个选项

  • C
    是可变的还是不可变的?它是值类型还是类类型?如果是值类型,则不能使用第一个选项

  • 在大多数情况下,上面的3个选项都可以,如果在应用程序中保持一致,那么选择将是个人的决定,不会影响代码的质量

    编辑:


    在我看来,第三种选择确实是最适合您的情况的解决方案。但是,正如我之前所说,没有一个“最佳”解决方案

    谢谢。也许我应该提供一些关于我的场景的更多细节,我将编辑我的问题。