2016-08-25 2 views
0

Я разрабатываю приложение iOS с Xcode и Swift.UI зависает и действие выполняется с задержкой

У меня есть проблема с этим кодом:

@IBAction func login(sender: AnyObject) { 
     let request = NSMutableURLRequest(URL: NSURL(string: "http://myurl.com/contact/checklogin.php")!) 
     request.HTTPMethod = "POST" 
     let postString = "username=\(username.text!)&password=\(password.text!)" 
     request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      data, response, error in 

      let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("responseString = \(responseString)") 

dispatch_async(dispatch_get_main_queue(),{ 
      if (responseString == "false") { 
       let alert = UIAlertView(title: "Error!", message: "Something is wrong. Please check this!", delegate: nil, cancelButtonTitle: "Okay") 
       alert.show() 
      } 
      else { 
       let alert = UIAlertView(title: "Successful!", message: "You'll get logged in now!", delegate: nil, cancelButtonTitle: "Okay") 
       alert.show() 
      } 
     } 
}) 
     task.resume() 
    } 

Когда пользователь входит в этом коде отправляет имя пользователя и пароль в PHP scipt на моем сервере. Этот PHP-скрипт проверяет, действительно ли эта пара данных/паролей существует. Если это так, то отвечает «true», иначе «false».

Проблема заключается в следующем: Когда пользователь подает запрос, (этот код будет запущен), пользовательский интерфейс замерзает в течение нескольких секунд, а оповещение требует ок. Появится 15 секунд. Но это не ошибка скрипта PHP, потому что print("responseString = \(responseString)") печатает сразу. Я также получаю это сообщение об ошибке: https://codeshare.io/TGwe6

Кто-нибудь знает, что я делаю неправильно?

P.S.

Я знаю, что многие думают, что в коде отсутствует код (например, хеш вместо пароля или проверка на наличие пустых файлов). Это всего лишь пример.

P.P.S: Обновлен код. Теперь работает.

+0

1) Никогда не делать работу пользовательского интерфейса в фоновом потоке. 2) 'UIAlertView' устарел. – rmaddy

+0

2) Итак, что делать? –

+0

Прочитайте документацию для 'UIAlertView', он скажет вам, что использовать вместо этого. – rmaddy

ответ

1

Вам необходимо показать предупреждение по основной теме, всегда выполнять UI изменений в основной теме.

dispatch_async(dispatch_get_main_queue(),{ 
    //Show alert 
}) 

Примечание: Вы должны использовать UIAlertController вместо UIAlertView, потому что она устарела.

Существует много учебников для AlertController, некоторые из них приведены ниже.

+0

Ты герой. Большое спасибо. Работает. Я должен подождать 8 минут, чтобы принять ваш ответ. –

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