【发布时间】:2016-01-09 07:44:58
【问题描述】:
我有以下代码来获取对 cmets 列表的回复。 (1 条评论有很多回复)
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)
}
}
API.listReply 请求的完整处理程序永远不会被调用。 dispatch_group_enter(group) 被调用一次,并且 dispatch_group_leave(group) 永远不会被调用。代码卡在dispatch_group_wait。
奇怪的是,连UI都卡住了,这很奇怪,因为整个功能都是异步的。
【问题讨论】:
-
Alamofire 是否使用内部串行队列?您可能会无意中将其陷入僵局。你应该在它被冻结时暂停执行,看看它在哪里等待。
-
总是停在这一行:
dispatch_group_wait(group, DISPATCH_TIME_FOREVER) -
但是还发生了什么?该组中的某些块必须等待运行。
-
我认为这是死锁问题。但不知道怎么做?
-
尝试使用 dispatch_group_notify 而不是 _wait。