2015-11-12 2 views
0

У меня есть 2 окна в swift, один из них - диалоговое окно входа, которое отправляет NSURLConnection.sendAsynchronousRequest на сервер, чтобы получить аутентификацию. Как только он получит ответ, окно должно закрыть.Threading + несколько окон, вызывающих странные ошибки

Когда я закрываю окно (либо из класса окна Войти или в главном окне CLASS) я получаю эти ошибки:

This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release.

Я пробовал всякий фоновые потоки и т.д. Но я думаю, что этот вопрос что я закрываю окно, почему запрос asynch NSURLConnection все еще висит.

Мой код для отправки запроса асинхронной из окна входа в систему:

dispatch_async(dispatch_get_main_queue(), { 
      let queue:NSOperationQueue = NSOperationQueue() 
      NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in 
       var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil 
       let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary 
       let result: NSString = NSString(data: data, encoding: NSUTF8StringEncoding)! 

       let expectedString = "special auth string"! 
       if(result == expectedString) { 
        self.callback.loginOK() 
       } else { 
        self.output.stringValue = result 
       } 
       return 
      }) 
     }) 

элемент обратного вызова класса является родительский вид Контроллер илит, что порождает его, я затем закрыть окно входа в систему с помощью loginVC.view.window?.close() из основного приложения окно. Это вызывает ошибку.

ответ

1

Проблема заключается в том, что NSURLConnection.sendAsynchronousRequest всегда будет работать во вторичном потоке, и поэтому его обратный вызов будет вызываться из этого вторичного потока, несмотря на то, что вы вызываете его явно из основного потока. Вам не нужно обертывать NSURLConnection.sendAsynchronousRequest в основном потоке, вместо этого сверните свой self.callback.loginOK() для запуска в основном потоке с помощью dispatch_async, чтобы гарантировать, что в вторичном потоке не будут выполняться связанные с UI операции. Что-то вроде этого:

let queue:NSOperationQueue = NSOperationQueue() 
      NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in 
       var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil 
       let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary 
       let result: NSString = NSString(data: data, encoding: NSUTF8StringEncoding)! 

       dispatch_async(dispatch_get_main_queue() { 
       let expectedString = "special auth string"! 
       if(result == expectedString) { 
        self.callback.loginOK() 
       } else { 
        self.output.stringValue = result 
       } 
       }) 

       return 
      }) 
Смежные вопросы