Код после DispatchGroup (). Wait () никогда не вызывается - PullRequest
0 голосов
/ 03 сентября 2018

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

Вот код:

func execute<T: Mappable>(request: HttpRequest, responseType: T.Type) throws -> T? {
    var responseObject: T?
    let group = DispatchGroup()
    group.enter()

    Alamofire.SessionManager.default.request(request.stringURL, method: request.method, parameters: request.parameter.toJSON(), encoding: request.encoding, headers: request.headers)
        .validate()
        .response(completionHandler: { response in
            responseObject = self.singleResult(dataResult: response.data, resultType: T.self)
            group.leave()
    })

    group.wait()

    guard let response = responseObject else {
        return nil
    }

    return response
}

Проблема в том, что код в group.wait () никогда не вызывается, но с Чарльзом я вижу, что запрос работает и завершился.

1 Ответ

0 голосов
/ 03 сентября 2018

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

Если вы не хотите добавлять зависимость, вы можете использовать completion handler, как показано ниже, чтобы получить объект после завершения запроса.

func execute<T: Mappable>(request: HttpRequest, responseType: T.Type, completion: @escaping ((T?) -> Void)) {
        Alamofire.SessionManager.default.request(request.stringURL, method: request.method, parameters: request.parameter.toJSON(), encoding: request.encoding, headers: request.headers)
            .validate()
            .response(completionHandler: { response in
                let mappedObject: T? = self.singleResult(dataResult: response.data, resultType: T.self)
                completion(mappedObject)
            })
} 

Затем вы можете вызвать метод, как показано ниже,

let service = YourService()
service.execute(request: fetchUser, responseType: User.self) { user in
            guard let user = user else { return }
            print(user.name)
        }
...