2016-09-21 5 views
0

Я хотел бы упомянуть, что я видел много подобных вопросов и попытался код оттуда, но мой код работает асинхронно (я перехожу к другому ViewController только после второго щелчка на кнопку Войти. Вот почему я был бы очень признателен вам, указывая на проблему в моем коде, а затем ссылки мне кто-то еще.Как перенести выполнение кода на главный qeue

у меня есть метод, который отправляет данные Войти на сервер

import UIKit 
var IS_LOGGED_IN = Bool() 

class LoginDataSender: UIView { 
    func sendLogInData() { 
     let myUrl = NSURL(string: "https://somewebsite") 
     let request = NSMutableURLRequest(URL: myUrl!) 
     request.HTTPMethod = "POST" 
     let postString = "username=NAME&password=PASS" 
     request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

     NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      (data, respoonse, error) in 

      if error != nil 
      { 
       print("error=\(error)") 
       return 
      } 

      dispatch_async(dispatch_get_main_queue(), { 
       do { 
        let myJson = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSDictionary 

        IS_LOGGED_IN = myJson.valueForKey("status") as! Bool 
        print(IS_LOGGED_IN) 

       } catch { 
        print(error) 
       } 
      }) 

     }.resume() 
    } 
} 

и зову этот метод от ViewController

import UIKit 

class LoginViewController: UIViewController { 

    let logInDataSender = LoginDataSender() 

    @IBAction func pressLoginButton(sender: AnyObject) { 

     logInDataSender.sendLogInData() 

     if IS_LOGGED_IN { 
      performSegueWithIdentifier("LogInSegue", sender: self) 

     } 
} 

Как вы видите, я сохраняю результат в глобальной переменной IS_LOGGED_IN и на основании этого я выполняю операцию или нет. На данный момент я просто жестко определяю логин/пароль для тестирования.

Где я могу разместить dispatch_async, чтобы иметь возможность использовать значение IS_LOGGED_IN при первом нажатии кнопки «Вход в систему»? Большое спасибо!

+1

Если вы читали подобные вопросы, то, конечно, вы видели, что все они говорят вам необходимо добавить обработчик завершения к вашему методу и выполнить его segue внутри него. Вы пробовали это? – dan

+0

@dan Да, благодаря Сантошу сейчас я знаю, как это использовать. Прошу прощения за несколько недель программирования для iOS :) – Robert

ответ

0

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

func sendLogInData(completionhandler: (Bool)->()) { 
    //....... 
    dispatch_async(dispatch_get_main_queue(), { 
      do { 
       let myJson = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSDictionary 
       completionhandler(myJson.valueForKey("status") as! Bool) 
      } catch { 
       completionhandler(false) 
       print(error) 
      } 
     }) 
    //..... 
} 

И тогда в вашем методе действия LoginViewController:

@IBAction func pressLoginButton(sender: AnyObject) { 
    logInDataSender.sendLogInData { (loggedIn) in 
    if loggedIn == true { 
     //Logged In 
     performSegueWithIdentifier("LogInSegue", sender: self) 
    }else{ 
     //Not logged in 
    } 
    } 
} 
+0

Большое спасибо за Сантош! Он отлично работает! Я только что добавил себя перед выполнением функцииSithueWithIdentifier. Дай пять! – Robert

+0

Рад, что это вам помогло! Проголосуйте и отметьте это как ответ! – Santosh

+0

Моя репутация слишком низкая, но я отметил ваш ответ. Еще раз спасибо! – Robert

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

  • Нет связанных вопросов^_^