2016-10-01 68 views
0

我有一個非常基本的用戶類,負責從Firebase獲取用戶數據並在需要時更新當前屏幕的操作系統,一切正常,直到決定更新我的項目斯威夫特3.0從Swift 2.3更新到Swift 3.0後,類協議無法工作

這是用戶級

@objc protocol userClassProtocol { 
     func updateScreen() 
     @objc optional func sucessUnlockedCategory() 
    } 

class User { 
    static let sharedInstance = User() 
    internal var delegate : userClassProtocol? 

    func fakeClassThatGetsDataFromFirebase() { 
     //Got data 
     print("Has new data") 
     self.delegate?.updateScreen() 
    } 
} 

這裏是視圖控制器:

class FirstViewController: UIViewController, userClassProtocol { 
    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     print("View will load") 
     User.sharedInstance.delegate = self 
    } 

    func updateScreen() { 
     print("Screen is going to update") 
     //Do stuff here 
    } 
} 

日誌我從這個得到的是: 有新數據 查看將會出現

但是視圖控制器中的函數updateScreen()永遠不會被調用。 Xcode沒有指出錯誤。

+0

設置委託後,您是否調用fakeClassThatGetsDataFromFirebase? –

回答

1

看起來這只是方法調用的時間問題。

您的fakeClassThatGetsDataFromFirebase方法首先被調用,並且在那一點上,您的委託尚未設置。所以self.delegatenil打電話時:

self.delegate?.updateScreen()

這隻會如果您viewWillAppearfakeClassThatGetsDataFromFirebase

+0

你在做什麼,我改變了按鈕中的代碼,觸發fakeClassThatGetsDataFromFirebase調用該函數之前調用User.sharedInstance.delegate = self,它的工作原理是,這個完全相同的代碼工作之前(Swift 2.3),並且在理論上每次都會在FakeClassThatGetsDataFromFirebase之前調用。 –

+0

我想可能你的Swift 3轉換中的其他東西可能會與事件調用順序混淆。也許你應該將你的委託設置爲'FirstViewController'中的init方法,或者至少將調用鏈調高到'viewDidLoad'。 – kleezy

+0

這是否幫助您瞭解事物的底部?如果是這樣,請接受答案。 – kleezy

0

它不應該被調用之前調用,努力按照你的代碼。沒有什麼叫fakeClassThatGetsDataFromFirebase(),這就是你的委託方法應該叫updateScreen()

+0

fakeClassThaGetsDataFromFirebase每次在Firebase數據庫數據中進行更改時都會調用,但我沒有把這個代碼放到很大的代碼中,但是我得到了print(「有新數據」),那就是函數內部。 –