2015-10-28 13 views
0

請幫我理解爲什麼我無法更改/傳遞HTTP請求中的對象。在下面的例子中,我聲明瞭變量'someVar',並在請求處理程序中對其進行了修改。但是,print函數在init和函數的結尾都返回5。將對象傳出響應處理程序

var someVar = 5 

init() { 

    getHtml() 

    print(self.someVar) 

} 

func getHtml() { 

    Alamofire.request(.GET, "https://www.google.com/") 
     .response { (request, response, data, error) in 

     self.someVar = 10 

    } 

print(self.someVar) 

} 

問題:

  1. 爲什麼它不打印出一個 '10' 在這兩種情況下?

  2. 如何更改請求處理程序中的對象?

對於糟糕的術語或者如果這是一個奇怪的問題,我會提前道歉。我是Swift新手,這是我的第一個堆棧溢出問題。

+0

'request'是異步的。在塊有機會執行之前,你可能會碰到'print'。 –

回答

0

1)它不打印 「10」,因爲在這兩種情況下

print(self.someVar) 

之前

這是因爲你的要求是異步執行一個。這意味着它將在每次完成時返回並觸發您指定的完成塊。但是,這個請求不會阻塞你的代碼,因此下一行會立即執行。

2)你改變你的對象的方式是正確的,並正在工作。這只是你看不到結果,因爲你的print()在對象被改變之前被調用。你的代碼更改爲:

var someVar = 5 

init() { 

    getHtml() 

} 

func printVar() { 
    print("My variable is now \(self.someVar)") 
} 

func getHtml() { 

    Alamofire.request(.GET, "https://www.google.com/") 
     .response { (request, response, data, error) in 

     self.someVar = 10 
     self.printVar() 
    } 

print("My variable is still \(self.someVar)") 

} 

運行這段代碼,你會看到,首先你一條線「我的變量仍然是5」,然後一些延遲後,你會得到「我的變量現在是10」。我希望這會幫助你理解異步請求中的完成處理程序是如何工作的。

我已經把第二個print()放入一個單獨的函數來說明如何調用某個函數來通知您的類請求已返回,現在可以使用它隨附的數據。

+0

謝謝你的回答。深表感謝。 –