2017-04-14 184 views
0

我有一個返回一個NSDictionary一個回調函數:獲取價值

override func viewDidLoad() 
{ 
    super.viewDidLoad() 


    var nd: NSDictionary = [:] 
    parseJSON(callback: {dict in 
     nd = dict 
     //print(nd)  This one prints the filled dictionary correctly 
    }) 
    //print(nd)  This one prints an empty dictionary 

} 

我要存儲的值從「ND」回調函數返回,但回調外print語句仍然打印一個空的NSDictionary。

我在這裏做錯了什麼,我該如何解決?

編輯:

var nd: NSDictionary! = nil 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     loadData() 
     print(self.nd) 
    } 

    func loadData() 
    { 
     parseJSON(callback: {dict in 
      self.nd = dict 
      print(self.nd) 
     }) 
    } 

我改成了這一點,因此函數完成其裝載,然後打印。但是,viewDidLoad()中的print語句在loadData()之前打印,而viewDidLoad()中的print語句仍然打印爲零。爲什麼會發生這種情況,我需要做些什麼改變?

+0

請參閱我對此線程的回答:http://stackoverflow.com/questions/41209804/waiting-for-asynchronous-function-call-to-complete/41209941#41209941。 –

+0

parseJSON()是一個異步函數。它在你要求它做的工作完成之前立即返回。一旦工作完成,它會調用您傳遞給它的回調。你需要把代碼放到回調函數的大括號中。 –

+0

@DuncanC感謝您的信息。看我的編輯,你能解釋一下嗎? –

回答

0

看起來像parseJSON在後臺運行並且可能只會在您的方法結束後完成。因此,nd將在通話結束後立即保持爲空。

我的建議:添加詞典處理邏輯內部上述回調(再複製的結果到一個變量viewDidLoad方法)。

+0

所以我應該在viewDidLoad方法之外初始化「nd」,然後在另一個方法外訪問它?我該如何解決它? –

+0

你可以做到這一點,但確切的時間可能會很棘手,以確保正確。你最好的選擇是在真正的回調中添加你的邏輯*。 –

+0

謝謝。我可以讓我的邏輯在回調中工作,但是有可能根據好奇心獲取回調函數之外的數據嗎? –