Alamofire completionHandler of responseJSON no se llama

Tengo el siguiente código para search las respuestas a una list de comentarios. (1 comentario tiene muchas respuestas)

static func fetchCommentsAndTheirReplies(articleId: String, failure: (()->Void)?, success: (comments: [[String: AnyObject]], replies: [[[String: AnyObject]]], userIds: Set<String>)->Void) { var retComments = [[String: AnyObject]]() var retReplies = [[[String: AnyObject]]]() var retUserIds = Set<String>() Alamofire.request(.GET, API.listComment, parameters: [API.articleId: articleId]).responseJSON { response in guard let comments = response.result.value as? [[String: AnyObject]] else { failure?() return } print(comments) retComments = comments let group = dispatch_group_create() for (commentIndex, comment) in comments.enumerate() { guard let id = comment["_id"] as? String else {continue} let relevantUserIds = parseRelaventUserIdsFromEntity(comment) for userId in relevantUserIds { retUserIds.insert(userId) } retReplies.append([[String: AnyObject]]()) dispatch_group_enter(group) Alamofire.request(.GET, API.listReply, parameters: [API.commentId: id]).responseJSON { response in if let replies = response.result.value as? [[String: AnyObject]] { for (_, reply) in replies.enumerate() { let relevantUserIds = parseRelaventUserIdsFromEntity(reply) for userId in relevantUserIds { retUserIds.insert(userId) } } //TODO: need to capture commentIndex? retReplies[commentIndex] = replies } dispatch_group_leave(group) } } dispatch_group_wait(group, DISPATCH_TIME_FOREVER) success(comments: retComments, replies: retReplies, userIds: retUserIds) } } 

El manejador completo de la request API.listReply nunca se llama. dispatch_group_enter(group) se llama una vez, y dispatch_group_leave (grupo) nunca se llama. El código se atasca en dispatch_group_wait . Lo extraño es que incluso la interfaz de usuario está atascada, lo cual es extraño porque toda la function es asíncrona.

He encontrado un problema similar:

en el subprocess de UI principal, llame a:

 dispatch_semaphore_wait(loginDoneSemaphore, DISPATCH_TIME_FOREVER) 

y llame a http usando Alamofire, interno también use su httpRequest.responseJSON

-> finalmente encontró el código dentro del manejador de respuesta responseJSON nunca llamado

-> causa el código de búsqueda después de DISPATCH_TIME_FOREVER nunca llamado

-> finalmente encontrar la causa raíz es: la respuesta de AlamofireJSON, por defecto, si no pasa el subprocess / queue, se ejecutará en el subprocess principal de interfaz de usuario

-> antes de llamar a Alamofire, tenga en el hilo de UI principal, para usar el hilo de UI de locking DISPATCH_TIME_FOREVER

-> así que siguiendo la respuesta de Alamofire JSON, que se ejecuta también en el hilo principal de interfaz de usuario, nunca llamará

-> mi solución es: designa Alamofire hacer respuesta http en otro hilo:

 let BackgroundThread:dispatch_queue_t = dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0) func dispatchBackground_async(thingsTodo:()->()) { dispatch_async(BackgroundThread, thingsTodo) } dispatchBackground_async({ httpRequest.responseJSON(queue: BackgroundThread, completionHandler: { response in gLog.debug("request=\(response.request), response=\(response.response), statusCode=\(response.response?.statusCode), result=\(response.result)") // [Debug] [com.apple.root.background-qos] [CrifanLibHttp.swift:21] }) 

Esto tal vez sea útil para que lo consulte.

-> tal vez pueda usar mi método: configure otro hilo para la respuesta de Alamofire JSON, para resolver su problema.

No estoy familiarizado con los elementos internos de Alamofire, pero parece probable que cumpla todos tus bloques de finalización de respuesta en la misma queue de serie. Tu dispatch_group_wait está bloqueando otras respuestas para terminar y llamar a su dispatch_group_leave s.

Puede resolver este problema utilizando dispatch_group_notify lugar de dispatch_group_wait , de modo que, en lugar de bloquear el hilo, simplemente enviará el bloque a una queue cuando sea necesario.