2016-07-05 136 views
1

所以,我試圖做一個Alamofire請求,然後,我會從JSON數據中獲取所需的信息並將其放入一個全局變量,這是我的代碼。問題與全局變量和Alamofire

struct myVariables { 
static var variableOne = "" 
} 


func function() { 
Alamofire.request(.GET, "API URL").responseJSON { response in 
    if let rawJSON = response.result.value { 
     // Here I just take the JSON and put it into dictionaries and parse the data. 
      myVariables.variableOne = String("data") 
     } 
    } 
} 

好吧,基本上,我試圖從另一個Swift文件訪問variableOne的數據。比方說,我製作了兩個Swift文件,其中一個文件中我有一個編輯全局變量值的函數,如果我嘗試打印該全局變量,則會看到編輯後的值。但是,無論何時我使用Alamofire,當我嘗試編輯全局變量時,其他Swift文件都看不到更改的值。所以如果我試圖編輯Alamofire請求代碼塊中的全局變量,每當我從另一個文件打印變量時,我都看不到更改。

如果有人知道更好的表達方式,請糾正它。

回答

1

我懷疑問題不在於您沒有看到價值變化,而是因爲您正在處理異步方法而引發的問題。例如,當您撥打function時,它會立即返回,但您的variableOne可能不會立即更新,而是稍後更新。我敢打賭,在這個異步響應封閉有機會被調用之前,你正在檢查它。

如果不是使用這個「全局」(這是一個壞主意,無論如何),你不會有這個問題,而是你自己採用了完成處理程序模式。

func function(completionHandler: (String?) ->()) { 
    Alamofire.request(.GET, "API URL").responseJSON { response in 
     if let rawJSON = response.result.value { 
      // Here I just take the JSON and put it into dictionaries and parse the data. 
      completionHandler(String("data")) 
     } else { 
      completionHandler(nil) 
     } 
    } 
} 

的你會調用這個像這樣:

function() { string in 
    // use `string` here 
} 

// but not here, because the above closure runs asynchronously (i.e. later) 

通過使用此完成處理模式,我們解決了「我怎麼知道什麼時候該異步方法是做」的問題。通過將必要的數據作爲閉包的參數傳遞回來,我們可以刪除全局變量的使用,從而儘可能縮小數據範圍。

很明顯,你應該改變閉包的參數以匹配你的情況適合的任何東西。但希望這可以說明基本的想法。

+0

謝謝!完美工作。 –