Ожидание завершения обновления API - Swift 5 - PullRequest
0 голосов
/ 11 июня 2019

Я пишу приложение для регистрации некоторых устройств в моей среде. У меня есть экран регистрации, где пользователь может ввести свое имя пользователя. Затем я посылаю команду через привилегированного помощника, чтобы зарегистрировать машину на нашем сервере MDM. Пока все это работает очень хорошо. Однако, поскольку двоичный файл, с которым взаимодействует помощник, не имеет дескрипторов XPC, я не могу проверить, когда он завершится. Но мое приложение должно остановиться, пока регистрация на сервере не будет обновлена.

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

func isUsernameSetAndMatchesLocal(sAMAccountName: String, usernameSet: @escaping (Bool?, URLResponse?, Error?) -> Void) {

    let url = "https://my.api.com/api/" + getSerialNumber() + "/subset/Location"
    guard let request = try? setupJssApiUrlRequest(apiURL: url) else {
        print("Malformed URL")
        return
    }
    URLSession.shared.dataTask(with: request) { data,response,error in
        guard let data = data else {
            print(error ?? "Error is nil")
            return
        }
        do {
            let decoder = JSONDecoder()
            decoder.keyDecodingStrategy = .convertFromSnakeCase
            let computer = try decoder.decode(ComputerRecord.self, from: data)
            if  computer.computer.location.username == sAMAccountName {
                usernameSet(true, response, error)
            } else {
                usernameSet(false, response, error)
            }
        } catch {
            usernameSet(false, response, error)
        }
    }.resume()
}

Это хорошо работает, и если я запустлю это, скажем на детской площадке:

let myObject = myClass.init()
myObject.isUsernameSetAndMatchesLocal(sAMAccountName: "john.smith"){ bool, response, error in
    guard let bool = bool else {
        print("We got an error")
        return
    }
    print(bool)
}

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

var isAssigned = false
while isAssigned == false {
    self.myJSS.isUsernameSetAndMatchesLocal(sAMAccountName: sAMAccountNameValue){ bool, response, error in

    guard let bool = bool else {
         return
     }
       isAssigned = bool
     }
 }

Это похоже на ошибку, и код либо не запускается, либо получает противоречивые результаты. Я уверен, что есть способ сделать это, но я не уверен. По сути, я хочу, чтобы приложение:

  1. Сравнить имя пользователя, которому назначено устройство, и вернуть true / false
  2. Пока false, подождите и проверьте снова
  3. Когда мы получим истину, тогда продолжаем

Надеюсь, это имеет смысл! Люди на этом сайте очень помогли с другими вопросами, поэтому я надеюсь, что кто-то еще может поделиться своими знаниями.

Спасибо, Людет (Эд)

...