Закрытие теряется при использовании группы отправки - PullRequest
1 голос
/ 10 июля 2019

Код отправки не вызывается. Когда я вызываю метод reLog (), он не выполняет код, написанный в блоке DispatchQueue.main.async.

       func reLog() -> Bool {
            var isVerified = false
            let group = DispatchGroup()
            group.enter()
            DispatchQueue.global(qos: .default).async {
                    self.login({ () -> Void in
                        isVerified = true
                        group.leave()
                    }, fail: { (failureDict) -> Void in
                        group.leave()
                    })
                }
            group.wait() 
            return isVerified
        }


        func login(_ success : (()-> Void), fail : (()-> Void)){
             let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil)
             let task = session.dataTask(with: urlRequest){
                (data, response, error) -> Void in
                  DispatchQueue.main.async(execute: { () -> Void in
                       print("Testing")   // This closure not calling
                  })
             })
             task.resume()
        }

Теперь это мое требование к этому.Мне нужно реализовать это, потому что мне нужен ответ сервера для продолжения цикла.

for i in strings {
     let isLogged = relog()
     if isLogged {
        print("Successful")
    }
}

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Вам нужно внутри login

task.resume()

Заменить

group.wait() 
return isVerified

с

group.notify(queue:.main) {
  completion(isVerified)
}

И

func reLog(completion:@escaping(Bool) -> ())

Редактировать

func reLog(completion:@escaping(Bool) -> ())
            var isVerified = false
            let group = DispatchGroup()
            group.enter()
            DispatchQueue.global(qos: .default).async {
                    self.login({ () -> Void in
                        isVerified = true
                        group.leave()
                    }, fail: { (failureDict) -> Void in
                        group.leave()
                    })
                }
        group.notify(queue:.main) {
          completion(isVerified)
        } 
 }

вызов

 reLog {  isVerified in
   print(isVerified)
 }
0 голосов
/ 10 июля 2019

Закрытие не вызывается, потому что для delegate для URLSession установлено self, которое требует принятия протокола и реализации методов делегата.

Используйте метод init с nil делегат

let session = URLSession(configuration: .default)
let task = session.dataTask(with: urlRequest) {

И вы неправильно используете DispatchGroup, чтобы сделать асинхронную задачу синхронной.Это очень плохая практика.

...