2016-08-15 134 views
9

我在我的應用程序中有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,哪一個最適合我的情況? –

回答

9

我@ 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作爲觀察者添加的(其他標籤甚至沒有加載!)。有沒有辦法解決這個問題,或者我完全走錯了路! –

相關問題