2015-09-13 2 views
-1

У меня очень странная проблема, которую я не мог решить. Я разрабатываю приложение iOS с помощью быстрого доступа. В классе (класс A) я вызываю другой класс (класс B) для подключения к серверу. Этот сервер возвращает json, я передаю результат классу A, но получаю важную задержку для операции, которую я хочу.Очень странная проблема в коде Swift. Задержка для совершения операций

Вот код класса А:

func loginUser() { 


    //check for data 
    if txt_mail!.text == "" || txt_password!.text == ""{ 
     var alertView = UIAlertView(title: "Error", message: "no data", delegate: nil, cancelButtonTitle: "OK") 
     alertView.show() 
    } 
    else 
    { 

     //save data and login 
     var data:NSMutableDictionary = NSMutableDictionary(objects: [txt_mail!.text, txt_password!.text], forKeys: ["email", "password"]) 
     loginUserClass().loginUser(data) 


    } 

} 

в классе B я есть:

func loginUser (data:NSMutableDictionary) { 


    var success_login:Int = 0 
    userData = data 

    //request for login 
    var request = NSMutableURLRequest(URL: NSURL(string: "http://link_to_server")!) 
    var session = NSURLSession.sharedSession() 
    request.HTTPMethod = "POST" 

    let email:String = userData.valueForKey("email") as! String 
    let password:String = userData.valueForKey("password") as! String 
    let auth:NSMutableDictionary = ["email":email,"token":password] 


    var err: NSError? 
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err) 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 

     var err: NSError? 
     var json_return_server = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary 

     if(err != nil) { 
      //error 
      success_login = 0 
     } 
     else { 
      success_login = 1 

      } 

     } 


     /* 
     Now I call another func in class A for "working" the result 
     */ 

     dispatch_async(dispatch_get_main_queue(), { 

      loginWithMailScreen().LoginUser_result(success_login) 

     }) 



    }) 

    task.resume() 




} 

так FUNC, что работает результат в классе А:

func LoginUser_result (success:Int) { 

    if success == 1{ 

     print("Success...") 
     let alert = UIAlertView(title: "Good", message: "Success...", delegate: nil, cancelButtonTitle: "Ok") 
     alert.show() 


    } 
    else if success == 0{ 

     print("Error...") 
     let alert = UIAlertView(title: "Error", message: "I'm sorry", delegate: nil, cancelButtonTitle: "Ok") 
     alert.show() 
    } 


} 

Странно, потому что консоль печатает «Успех ...» или «Ошибка ...» очень быстро, но приложение показывает предупреждение через 10 секунд !!! Любая идея о причине и о том, как я мог бы решить ???

PS: извините за мой плохой английский, я итальянский

EDIT: Я думаю, что сервер очень быстро, на самом деле, как я сказал, что я имею правильный результат (0 для неправильного почты/пароль, 1 для правая почта/пароль). странное поведение, я думаю, это задержка для предупреждения

Я редактирую свой код, как предложил Султан. Есть еще одна проблема с подобным кодом. На самом деле, у меня нет проблем с предупреждением (без задержки), но никакая другая функция не возможна (увольнение не работает) !!!

Любая идея?

+0

Связанные в Obj-C http://stackoverflow.com/questions/11386403/delay-when-updating-view-in-the-completionhandler-of-an-async-http-request – Sulthan

ответ

0

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

dispatch_async(dispatch_get_main_queue(), { 

    loginWithMailScreen().loginUser_result(success_login) 

}) 
+0

очень хороший ответ , но он работает, только если я хочу показать предупреждение. Если я хочу, чтобы закрыть контроллер представления он не работает (я использую если успех == 1 { self.dismissViewControllerAnimated (правда, завершение: ноль) } ) – user1106897

+0

@ user1106897 Он работает каждый раз для этого вид проблем. – Sulthan

+0

очень странно :( он работает для предупреждения (без задержки), но не работает для увольнения – user1106897

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