我应该使用委托方法还是UINotificationCenter

时间:2016-03-31 02:57:51

标签: ios swift delegates uipageviewcontroller

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

现在我已经为ViewControllerA实现了一个委托方法(由rootViewController创建),告诉UIPageViewController它必须停止滚动,具体取决于ViewControllerA给出的信息。但是,ViewControllerA能够调用rootViewController实现的委托方法,则rootViewController需要ViewControllerA的实例变量。

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

2 个答案:

答案 0 :(得分: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更受欢迎,因为它们更具有类型安全性,可读性和灵活性。

答案 1 :(得分:0)

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