通知中心还是关闭?

问题描述 投票:0回答:2

各位主管:我查了很多才决定问 这个问题,但我没有找到我想要的。

我的问题是: 使用

NotificationCenter
和使用
Closures
在两个实例之间进行通信哪个更好? 如果它们相似,我应该使用什么?

希望这个例子可以帮助您更好地理解:-

如果我们以

URLSession
类为例。为什么它的大多数方法都有一个闭包?他们为什么不发送带有
Data, Response, and Error
的通知?

我知道它们之间的区别,我只是不知道在什么情况下应该使用它们。

swift closures nsnotificationcenter
2个回答
9
投票

但是,在某些情况下,这些模式是可以互换的:

  1. 对于简单情况,使用闭包是最简单的解决方案
  2. 当两个对象之间存在复杂通信时,使用委托很常见。一个委托可以比许多闭包更好。
  3. 当您有多个观察者或不确定将观察哪些对象时,您必须使用通知。

您可能会问自己为什么我们在简单情况下使用闭包而不是委托或通知。答案是闭包是最轻量级的。它们很容易创建,并且会对您的代码质量产生积极影响。

让我们考虑一个完成回调。如果您决定使用通知,则需要另一种方法来处理该通知。这对代表同样有效。如果您需要一些上下文(例如触发操作的参数),您需要将其保存到属性中。

另一方面,可以内联创建闭包。这意味着触发操作并处理其结果的代码位于一处。这确实简化了代码的结构。另请注意,如果闭包需要一些上下文,它可以捕获它,而不需要创建额外的属性。


0
投票

我会说:

  1. 结束语适用于当您希望父母对孩子做出反应时。防止循环引用可能很棘手,但如果做得正确,就可以避免使用实例变量,例如当在多个闭包中使用某些内容并内联声明时,闭包将根据需要保留该内容,从而使您无需使用
    deinit
  2. 通知是子级对父级做出反应的松耦合。例如。使用
    UIViewControllerShowDetailTargetDidChangeNotification
    ,您可以只在子视图控制器中监听,这使父级无需管理要通知的子级列表,如果子级发生变化,这会很棘手。
  3. Delegate 是自定义一个对象而不需要子类化,例如符合
    UIApplicationDelegate
    的类像子类那样搞乱
    UIApplication
    的标准行为的风险较小(例如,您忘记调用 super 或意外覆盖同名的方法)。最好每个目标实例有一个委托实例,例如不要让一个实例成为多个表视图的委托。
© www.soinside.com 2019 - 2024. All rights reserved.