DispatchGroup с асинхронной задачей - PullRequest
0 голосов
/ 22 октября 2018

enter code here Я много чего пробую с группой рассылки, но не могу получить стабильный результат.Я использую Alamofire для получения данных с моего сервера.Я написал функцию в классе Helper и использую эту функцию в AppDelegate.swift.

Я не знаю, помещаю ли я группу диспетчеризации при вызове функции, чтобы в AppDelegate, или я помещаю группу диспетчеризации только в функцию в классе помощника.

    func alomofireGet(URL: String, onCompletion:@escaping ((JSON) -> Void)) {
   // let group = DispatchGroup()
    var contentJSON = JSON()
   // group.enter()
    Alamofire.request(URL, method: .get).responseJSON() { (reponse) in
        if reponse.result.isSuccess {
            contentJSON = JSON(reponse.result.value!)
        } else {
            contentJSON = JSON(reponse.result.error!)
        }
     //   group.leave()
    }
  //  group.notify(queue: .main) {
        onCompletion(contentJSON)
}

В приложении «Делегат» я пишу функцию, которая вызывает функцию в моем классе.

    func connect() {
    let group = DispatchGroup()
    let _: Bool = KeychainWrapper.standard.removeObject(forKey: "token")
    var token = String()
    group.enter()
    Helper().alomofireGet(URL: "http://192.168.1.19/app_dev.php/login/app") { contenuJSON in
        token = contenuJSON["csrfToken"].stringValue
        group.leave()
    }
    group.notify(queue: .main) {
        let _: Bool = KeychainWrapper.standard.set(token, forKey: "token")
        let t: String? = KeychainWrapper.standard.string(forKey: "token")
        print(t!)
   }
}

Проблема в том, что переменная "t" пуста.И когда я вызываю keychainWrapper в делегате приложения, цепочка для ключей также пуста.

PS: У меня есть другая задача, я просто уменьшил свой код

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Я пытаюсь это, но это не решение.Я удалил функцию в моем помощнике.Я оправдал эту функцию в приложении-делегате.

func connect(onCompletion : @escaping (String) -> ()) {
    let group = DispatchGroup()
    var token = String()
    let _: Bool = KeychainWrapper.standard.removeObject(forKey: "token")
    group.enter()
    Alamofire.request("http://192.168.1.19/app_dev.php/login/app", method: .get).responseJSON() { (reponse) in
        if reponse.result.isSuccess {
            let contentJSON = JSON(reponse.result.value!)
            token = contentJSON["csrfToken"].stringValue
        } else {
            token = "Invalid Token"
        }
       group.leave()
    }
    group.notify(queue : DispatchQueue.global()) {
        onCompletion(token)
    }
}

при печати токена появляется пустое сообщение.

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    Thread.sleep(forTimeInterval: 1.5)
    connect() { token in
        print(token)
    }
    return true
}
0 голосов
/ 22 октября 2018
func alomofireGet(URL: String, onCompletion:@escaping ((JSON) -> Void)) {
   // let group = DispatchGroup()
    var contentJSON = JSON()
   // group.enter()
    Alamofire.request(URL, method: .get).responseJSON() { (reponse) in
        if reponse.result.isSuccess {
            contentJSON = JSON(reponse.result.value!)
        } else {
            contentJSON = JSON(reponse.result.error!)
        }
     //   group.leave()
    }
  //  group.notify(queue: .main) {// where you call wait()function. This blocks the current thread until the group’s tasks have completed.
        onCompletion(contentJSON)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...