2015-01-28 2 views
2

Я пытаюсь изучить Swift, и то, что я пытаюсь сделать, - создать простую страницу входа. Когда пользователь нажимает кнопку входа в систему, я делаю запрос на свою веб-службу в файле shouldPerformSegueWithIdentifier, чтобы проверить правильность имени пользователя и пароля. Я не хочу использовать IBAction (например, touchupinside и т. Д.). После разбора ответа, полученного от веб-службы, я проверю, есть ли какая-либо ошибка из-за ответа веб-службы (например, имя пользователя недействительно). Если есть какая-либо ошибка, я хотел бы предотвратить segue, вернув false. Но я не могу вернуть ложь внутри Alamofire. Итак, как я должен справиться с этим? Вот мой код:Как я должен обрабатывать ответ Alamofire в файле toPerformSegueWithIdentifier?

override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool { 

    if identifier == "segueLoginToMainPage" { 
     //... 
     //Checking if text fields are filled or not 

     else { 
      let callURL : String = CONFIG.BASE_URL + "user/login" 
      let parameters = [HTTPParamNames.FIELD_USER_NAME : self.txtUserName.text, 
          HTTPParamNames.FIELD_PASSWORD : self.txtPassword.text] 
      Alamofire.request(.POST, callURL, parameters: parameters) 
       .responseJSON { (_,_,JSON,_) in 
        var returnedData = JSON as NSDictionary 
        if returnedData["status"] as String == "error" { 

         //thats what i want to do 
         return false 
        } 
       } 

     } 
    } 

    return true 
} 

Но я не могу вернуть false, потому что он асинхронный. Я нашел несколько таких вопросов в stackoverflow, но ответы не совсем то, что я ищу. Благодаря!

ответ

1

Я думаю, что не используется IBAction - хорошее решение в этом случае, но в любом случае есть обходное решение, как достичь своей цели. Для этого обходного пути вам нужно объявить переменную, напечатанную в буле, чтобы проверить, пользователь ли готов войти в систему. Ваш метод toPerformSegueWithIdentifier должен всегда возвращать значение этой переменной, но после того, как вы сделаете запрос. Наконец после того, как ваш запрос асинхронной отделка вызвать метод prepareForSegue

var readyForLogin = false 

override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool { 

if identifier == "segueLoginToMainPage" { 
    //... 
    //Checking if text fields are filled or not 

    else { 
     if(!readyForLogin){ 
      let callURL : String = CONFIG.BASE_URL + "user/login" 
      let parameters = [HTTPParamNames.FIELD_USER_NAME : self.txtUserName.text, 
         HTTPParamNames.FIELD_PASSWORD : self.txtPassword.text] 
      Alamofire.request(.POST, callURL, parameters: parameters) 
      .responseJSON { (_,_,JSON,_) in 
       var returnedData = JSON as NSDictionary 
       if returnedData["status"] as String != "error" { 
        //thats what i want to do 
        self.readyForLogin = true 
        self.performSegueWithIdentifier("segueLoginToMainPage", sender: self) 
       } 
      } 

    }} 
} 

return readyForLogin 
} 
+0

То, что я точно искал. Спасибо, много! – orhankutlu

+1

Np, но подумайте об изменении кода с помощью IBAction –

+0

Я изменю его. Еще раз спасибо! – orhankutlu

8

Вы просто не должны пытаться использовать асинхронный метод в пределах shouldPerformSegueWithIdentifier. Вместо этого вы должны:

  1. Удалить segue из самой кнопки входа.

  2. Добавить segue между контроллерами вида, сами. В частности, управление -drag от значка контроллера представления исходной сцены (в Xcode 6+ этот значок находится на панели над сценой, в более ранних версиях Xcode этот значок находится в панели ниже сцены) до места назначения ,

  3. Дайте этот новый segue «идентификатор раскадровки».

  4. Подключите кнопку входа в систему до функции IBAction.

  5. В этой IBAction функции выполняет ваш запрос асинхронной сети, и если Войти был успешным, то программным performSegueWithIdentifier, снабжая идентификатор раскадровки, указанную в шаге 3.

+2

Это решение требует IBAction, но его, как это должно быть сделано решением –

+0

Спасибо за ответ. Я не хотел использовать IBAction, но кажется, что это разумно сделать таким образом. – orhankutlu

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