2016-08-20 6 views
-1

У меня есть простой метод входа, который возвращает bool, зависит от успеха входа пользователя в систему. У меня проблема с порядком ответов и выполнением кода. Я читал о обработчиках завершения, которые, я думаю, являются решением моей проблемы, но я не уверен. Вот мой метод:Обработчик завершения с запросом POST

//perform user login in, setting nsuserdefaults and returning the bool result 
     func login(username: String, password:String) -> (Bool) { 

      var success:Bool = false 

      //sending inputs to server and receiving info from server 
      let postRequest = postDataToURL() 
      postRequest.link = "http://pnc.hr/rfid/login.php" 
      postRequest.postVariables = "username=" + username + "&password=" + pass 

word 

     postRequest.forData("POST") { jsonString in 
      // getting the result from the asinhronys task 
      let result = convertStringToDictionary(jsonString as String) 
      if let loggedIn = result?["loggedIn"] as? Bool where loggedIn == true { 

       let userType = result?["userType"] as? String 
       let token = result?["token"] as? String 

       //if user is logged - setting parameters in Key Chains and redirecting them to the menu view 
       let defaults = NSUserDefaults.standardUserDefaults() 
       defaults.setObject(loggedIn, forKey: "loggedIn") 
       defaults.setObject(username, forKey: "username") 
       defaults.setObject(userType, forKey: "userType") 
       defaults.setObject(token, forKey: "token") 

       success = true 
      } 
      else { 
       success = false 
      } 
      print ("class - " + String(jsonString)) 
      print ("classIN - " + String(success)) 
     } 

     print ("classOUT - " + String(success)) 
     return success 
    } 

Я хотел бы сделать возвращение переменного успеха внутри, если оператор, который проверяет переменную LoggedIn равно верно. Но в этом случае я получаю ошибку.

Тогда я сделал этот метод. Проблема в том, что метод возвращает переменную успех быстрее, чем запрос POST. Поэтому в каждом случае это будет ложным. Я печатал переменные, чтобы увидеть порядок выполнения кода, и метод сначала печатает «classOUT», возвращает переменную, а затем устанавливает значение переменной и печатает «classIN».

Как я могу подождать, пока код, который регистрирует пользователя, будет выполнен, поэтому я могу получить правильное значение успеха переменной?

+1

Это один чаще всего отвечал и задавал вопрос о iOS на Переполнение стека. Пожалуйста, прежде чем спрашивать, пожалуйста, Поиск на таких терминах, как «асинхронный». Вы не можете «вернуть» все, что зависит от асинхронной функции, потому что функция выполняется после того, как вы вернулись. – matt

ответ

0

Выполните вход пользователя в, установив NSUserDefaults и возвращают результат булева

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

func login(username: String, password:String,completionBlock : ((success : Bool)->Void)){ 

     //sending inputs to server and receiving info from server 
     let postRequest = postDataToURL() 
     postRequest.link = "http://pnc.hr/rfid/login.php" 
     postRequest.postVariables = "username=" + username + "&password=" + password 

    postRequest.forData("POST") { jsonString in 
     // getting the result from the asinhronys task 
     let result = convertStringToDictionary(jsonString as String) 
     if let loggedIn = result?["loggedIn"] as? Bool where loggedIn == true { 

      let userType = result?["userType"] as? String 
      let token = result?["token"] as? String 

      //if user is logged - setting parameters in Key Chains and redirecting them to the menu view 
      let defaults = NSUserDefaults.standardUserDefaults() 
      defaults.setObject(loggedIn, forKey: "loggedIn") 
      defaults.setObject(username, forKey: "username") 
      defaults.setObject(userType, forKey: "userType") 
      defaults.setObject(token, forKey: "token") 

      completionBlock(success:true) 
     } 
     else { 
      completionBlock(success:false) 
     } 
    } 
} 

когда вы называете это будет выглядеть примерно так: -

login(username: String, password:String,completionBlock : { (success) in 
    print(success) 
    }) 
+0

Что такое завершение? как сделать вызов func, который определен как это? –

+0

обновил код :) – Dravidian

+1

его принципиально другой параметр в вашей функции. хорошая вещь - это тоже функция – ha100

0

вы могли бы сделать что-то вроде этого

func login(username: String, password: String, completion: (Bool) ->()) { 


    ... YOUR USUAL NETWORKING CODE ... 


    completion(success) 

} 

, а затем вызвать его

login(username: anonymous, password: ******) { authStatus in 

    if authStatus == true { 
     print("user in") 
    } else { 
     print("try one more time") 
    } 

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