【问题标题】:Should I use a delegate method or UINotificationCenter我应该使用委托方法还是 UINotificationCenter
【发布时间】:2016-03-31 02:57:50
【问题描述】:

所以现在我有一个rootViewController,它有一个UIPageViewController 作为其唯一的子视图,rootViewController 基本上是UIPageViewController 的包装类。现在我想从ViewControllerA(由rootViewController拥有)禁用UIPageViewController的滚动。

现在我已经为rootViewController 实现了一个委托方法(由ViewControllerA 创建),它告诉UIPageViewController 它必须根据ViewControllerA 提供的信息停止滚动。但要让ViewControllerA 能够调用由rootViewController 实现的委托方法,则需要rootViewControllerViewControllerA 的实例变量。

这是最佳做法吗?使用NSNotificationCenter 会是更好的选择吗?还是这些方法都不是最佳选择?

【问题讨论】:

  • 当您希望多个对象被告知正在发生的事情时,通常使用通知中心

标签: ios swift delegates uipageviewcontroller


【解决方案1】:

最佳做法是使用委托或回调属性:

final class ViewControllerA: UIViewController
{
    var callback: (ViewControllerA -> ())?

    func somethingHappened()
    {
        callback?(self)
    }
}

如果你使用这种风格,一定要避免引用循环:

let viewControllerA = ViewControllerA()
viewControllerA.callback = { [weak self] _ in ... }

如果您使用委托,请使用 weak var 避免引用循环:

weak var delegate: ViewControllerADelegate?

这些样式比 NSNotificationCenter 更可取,因为它们更安全、更易读且更灵活。

【讨论】:

  • 您能提供一些使用回调属性的示例代码吗?我以前没见过它,如果有掌握它的人已经给我举了一个例子,那就太棒了!
  • 我扩展了它——你只需声明一个带有可选函数类型的var,然后在创建对象时将其分配给闭包。如果需要,您可以传递调用回调的对象(就像委托方法所做的那样),或者不传递,在这种情况下它并不重要。根据需要添加其他参数。
【解决方案2】:

有很多方法可以解决您的问题。如果您可以设置将 rootViewController 变量添加到您的 ViewControllerA 并能够在创建 ViewControllerA 期间设置它,那么这将是调用它的最快方法。当涉及多个线程时,我通常使用 NSNotificationCenter。因此,如果我有一个异步任务正在运行,例如 HTTP 调用,并且它需要应用程序根据结果做出相应的反应,那么使用 NSNotificationCenter 是一个不错的选择,因为它可以轻松地在应用程序范围内发送消息,您只需要添加取决于消息的观察者。

【讨论】:

  • 所以我想在这种情况下使用 NSNotificationCenter 会有点过分?
  • 在你的情况下,我猜你可以在你的 ViewControllerA 中添加一个变量来保存对你的 rootViewController 的引用。这将是最快的方法,因为您只有两个类要处理。
猜你喜欢
  • 2012-05-29
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多