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)
}
}
我@ 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
}
感谢您的回答。这对我有效。但是如果我想添加类A的观察者B会发生什么?我实际上想要做的是当类A通过完成处理程序完成作业时调用类B的方法'viewDidLoad'。 –
你不应该直接调用视图控制器的'viewDidLoad'。如果你有一个B实例的引用,那么你可以将该对象设置为观察者(addObserver的第一个参数),但通常一个类应该管理自己的观察。既然你说你想调用'viewDidLoad',实际上你应该在检索数据时触发一个从A到B(或呈现B)的segue,在这种情况下你不需要NSNotifications – Paulw11
我有一个UITabBarViewController,所以我希望它要求网络层为我提取所有数据。在这个过程之后,我想通知它的每个选项卡他们的数据已准备好使用。但正如你所知道的那样,它只是第一个标签的ViewController作为观察者添加的(其他标签甚至没有加载!)。有没有办法解决这个问题,或者我完全走错了路! –
使用NSNotifications – Paulw11
谢谢。我在这里阅读了这篇文章,但我不明白有什么区别B/W NSNotifications&NSNotificationCenter&performSelector&KVO,哪一个最适合我的情况? –