2017-01-02 2 views
0

Это код, у меня есть:Дождитесь завершения этого обработчика, чтобы завершить выполнение, прежде чем функция возвращает значение

 func authenticateCredentials(usernameString: String, passwordString: String) ->() -> Bool { 
     func isAuthUser() -> Bool { 

     client.invokeAPI("AuthenticateAndFetchData", 
         body: nil, 
         httpMethod: "GET", 
         parameters: ["userid": usernameString,"password":passwordString], 
         headers: nil) 
     { 
      (result, response, error) -> Void in 
      if let err = error { 
       print("ERROR ", err) 

      } else if let res = result { 



        let jsonArray = res as! NSArray 
        for value in jsonArray[0] as! NSDictionary { 
         let jsonstring = value.value as! String 
         NetworkService.jsonResponse = jsonstring 
         if let data = jsonstring.data(using: .utf8) { 
          if let content = try? JSONSerialization.jsonObject(with: data, options: []), 
           let array = content as? [[String: Any]] 
          { 
           for jsondict in array { 
            let auth = jsondict["IsAuth"]! as! String 
            self.isAuth = (auth == "true") ? true : false 
            let substring = NetworkService.parseJSONString(jsonString: jsonstring, key: "Activities") 
            let substring2 = NetworkService.parseJSONString(jsonString: substring(), key: "activityname") 
            let activityString = NetworkService.parseJSONvalue(jsonString:substring()) 
           } 
          } 
         } 
        } 
       } 
      } 
      return self.isAuth 
     } 
     return isAuthUser 

    } 

} 

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

Итак, я должен нажать кнопку дважды, чтобы выполнить аутентификацию. Как я могу заставить его возвращать true только в первый раз. Я хочу дождаться выполнения блока завершения до возвращения функции.

+0

Вместо того, чтобы возвращать true или false из вашей функции. назовите его Async и поместите свой код в обработчик завершения –

+0

Спасибо за ответ. Я новичок в быстроте. Не могли бы вы помочь мне, как я могу назвать функцию async. –

ответ

0

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

func authenticateCredentials(usernameString: String, passwordString: String, completion: @escaping (Bool) -> Void){ 
    client.invokeAPI("AuthenticateAndFetchData", 
       body: nil, 
       httpMethod: "GET", 
       parameters: ["userid": usernameString,"password":passwordString], 
       headers: nil) { 
     ... 
     let auth = jsondict["IsAuth"]! as! String 
     let isAuth = (auth == "true") ? true : false 
     ... 
     completion(isAuth) 
    } 
} 

Вы можете, чем назвать его так:

authenticateCredentials(usernameString: "user", passwordString: "pass") { (isAuth:Bool) in 
    self.isAuth = isAuth 
    // go on with whatever you want to do and use self.isAuth successfully 
} 
+0

Завершение принимает bool как параметр b или void? –

+0

xcode просит меня добавить @escaping перед параметром завершения –

+0

Я не получил вызывающую часть, когда я вызываю функцию isAuth: Bool в self.isAuth = isAuth. Это дает ошибку компилятора. –

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