2015-11-05 61 views
-3

我的代碼以錯誤的順序運行。 aerror是在開始時打印的,應該在最後打印。以錯誤的順序執行的代碼

這裏是我的代碼

var aerror :Int? 
NSURLConnection.sendAsynchronousRequest(NSURLRequest(URL: url), queue: NSOperationQueue.mainQueue(), completionHandler: { (res, data, error) -> Void in 

     let str = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("\n********\nData\n*******") 
     print(str) 
     print("\n********\nData\n*******") 
     let json = JSON(data: data!) 

     aerror = json["Logon"]["error"].int! 
     print("\n********\njson\n*******") 
     print(json) 
     print("\n********\njson\n*******") 
    }) 
    print("\n********\naeeror=\(aerror)") 

這裏是輸出


aeeror=nil 

******** 
Data 
******* 
Optional({"func":"LogonJs","Logon":{"error":2}}) 
******** 
Data 
******* 
******** 
json 
******* 
{ 
    "Logon" : { 
    "error" : 2 
    }, 
    "func" : "LogonJs" 
} 

******** 
json 
******* 

我不知道爲什麼aerror第一次印刷。 我想在打印之前打印aerror。 任何人都可以幫我解決它嗎?

+2

它不是一個錯誤,它是一個功能;-) – vadian

+0

發送**異步**請求 – Sulthan

回答

2

NSURLConnection.sendAsynchronousRequest將啓動一個異步請求。這意味着無法告訴它什麼時候它會被調用完成,一旦它被調用,下一個語句將被執行。

一旦異步請求完成,您正在傳遞它的方法(completionHandler)就會運行。

簡單來說,正在發生的事情是這樣的:

- >調用sendAsynchronousRequest(用completionhandler)

- >print("\n********\naeeror=\(aerror)")(異步請求在後臺運行)

- >的異步請求完成

- >completionHandler執行

,因爲您在完成處理程序中指定了aerror,您也可以從完成處理程序中打印它。

var aerror :Int? 
NSURLConnection.sendAsynchronousRequest(NSURLRequest(URL: url), queue: NSOperationQueue.mainQueue(), completionHandler: { (res, data, error) -> Void in 

     let str = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("\n********\nData\n*******") 
     print(str) 
     print("\n********\nData\n*******") 
     let json = JSON(data: data!) 

     aerror = json["Logon"]["error"].int! 
     print("\n********\njson\n*******") 
     print(json) 
     print("\n********\njson\n*******") 

     print("\n********\naeeror=\(aerror)") 
    }) 
+0

如果你正在尋找理解異步與同步更好,請看這裏:http://stackoverflow.com/questions/748175/asynchronous -vs-synchronous-execution-what-do-it-really-mean –

1

一切正常...... NSURLConnection.sendAsynchronousRequest作爲陳述UB方法名發送帶有一旦接收到響應將執行完成處理的asyncronows請求。 你的代碼實際上做的是:

  1. 創建請求
  2. 發送移動「送」的整個過程中,「等待」和「管理響應(這意味着運行完成處理)」主線程

這在不同的線程

  • 打印錯誤意味着一旦sendAsynchronousRequest被調用程序不等待它完成,然後執行compltion處理程序,但堅持下去,並打印「AERROR」。這是異步性的全部目的!

    如果你想你的主線程等待完成處理程序終止繼續執行之前,我建議使用旗語或方法的

    sendSynchronousRequest(_:returningResponse:) 
    

    反正你應該使用NSURLSession而不是NSURLConnection的因爲這最後一個現在已被棄用。

  • +0

    我想返回aerror,你能告訴我如何處理它與NSURLSession同步?非常感謝你! –