2015-11-05 3 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 начнет асинхронный запрос. это означает, что нет способа сообщить, когда он будет завершен в момент его вызова, и как только он будет вызван, будет выполнен следующий оператор.

Метод, с которым вы проходите его (завершениеHandler), запускается после завершения асинхронного запроса.

Проще говоря, что происходит это:

-> называют 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-does-it-really-mean –

1

Все работает отлично ... NSURLConnection.sendAsynchronousRequest как указано иь имя метода отправки запроса asyncronows с обработчиком завершения, который будет выполняться после того, как будет получен ответ. Что ваш код на самом деле сделать это:

  1. Создать запрос
  2. отправить его перемещением всего процесса «отправки», «ожидание» и «управление ответом (что означает запуск обработчика завершения)» на другой поток
  3. печати ошибка в главном потоке

Это означает, что когда-то sendAsynchronousRequest вызывается программа, не дожидаясь ее завершения и запустить обработчик compltion но продолжать идти и печать «aerror». Такова цель асинхронности!

Если вы хотите, чтобы ваш основной поток ждать окончания обработчика завершения, прежде чем продолжить выполнение, я бы предложил использовать семафор или метод

sendSynchronousRequest(_:returningResponse:) 

В любом случае вы должны использовать NSURLSession вместо NSURLConnection потому что этот последний теперь устарел.

+0

Я хочу вернуть aerror, Не могли бы вы рассказать мне, как обращаться с ним синхронно с NSURLSession? Большое спасибо! –

Смежные вопросы