Swift:从另一个使用完成处理程序通知ViewController

问题描述:

我在我的应用程序中有2个ViewController。其中一个名为vcA的方法是使用一个方法(这里是viewDidLoad)与我的网络层(我的应用程序中的一个类)交谈。在完成联网工作(将由一个完成处理程序推断)后,我想通知类vcB调用一个方法来获取由网络层提供的一些数据。 请大家看看下面须藤代码:Swift:从另一个使用完成处理程序通知ViewController

class Networking { 

    static var PublicValue : SomeKindOfClass? = nil 

    static func test(completionHandler : (successful : Bool) -> Void) -> Void { 
     //Do some networking in background 
     Network.BackgroundNetworking() { 
     if result = true { 
      PublicValue = SomeValue 
      completionHandler(successful : true) 
     } 
     else { 
      completionHandler(successful : false) 
     } 
    } 
} 

class vcA : UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
     Networking.test(completionHandler : { (successful) in 
     if successful == true { 
      //Here I want to notify class vcB to call printPublicValue method 
     } 
     }) 
    } 
} 

class vcB : UIViewController { 

    func printPublicValue() { 

     print(Networking.PublicValue) 
    } 
} 
+2

使用NSNotifications – Paulw11

+0

谢谢。我在这里阅读了这篇文章,但我不明白有什么区别B/W NSNotifications&NSNotificationCenter&performSelector&KVO,哪一个最适合我的情况? –

我@ Paulw11同意你应该考虑使用NSNotifications。他们很容易建立和使用,并会在这种情况下很好地工作。要做到这一点,在您的视图控制器的一个把下面的代码:

NSNotificationCenter.defaultCenter().postNotificationName("nameOfNotification", object: nil) 

在你的第二个视图控制器(将要收到通知的)放:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(NameOfViewController.nameOfFunction(_:)), name: "nameOfNotification", object: nil) 

然后您可以创建像这样的功能:

func nameOfFunction(notif: NSNotification) { 
     //Insert code here 
} 

有一个伟大的教程在这里,如果你想要去更深入:

https://www.andrewcbancroft.com/2014/10/08/fundamentals-of-nsnotificationcenter-in-swift/

编辑:斯威夫特3执行此。

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "nameOfNotification"), object: nil) 

在你的第二个视图控制器(将要收到通知的)放:

NotificationCenter.default.addObserver(self, selector: #selector(self.nameOfFunction), name: NSNotification.Name(rawValue: "nameOfNotification"), object: nil) 

然后你就可以创建一个像这样的功能:

func nameOfFunction(notif: NSNotification) { 
     //Insert code here 
} 
+0

感谢您的回答。这对我有效。但是如果我想添加类A的观察者B会发生什么?我实际上想要做的是当类A通过完成处理程序完成作业时调用类B的方法'viewDidLoad'。 –

+3

你不应该直接调用视图控制器的'viewDidLoad'。如果你有一个B实例的引用,那么你可以将该对象设置为观察者(addObserver的第一个参数),但通常一个类应该管理自己的观察。既然你说你想调用'viewDidLoad',实际上你应该在检索数据时触发一个从A到B(或呈现B)的segue,在这种情况下你不需要NSNotifications – Paulw11

+0

我有一个UITabBarViewController,所以我希望它要求网络层为我提取所有数据。在这个过程之后,我想通知它的每个选项卡他们的数据已准备好使用。但正如你所知道的那样,它只是第一个标签的ViewController作为观察者添加的(其他标签甚至没有加载!)。有没有办法解决这个问题,或者我完全走错了路! –