- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下代码来获取对评论列表的回复。 (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都卡住了,这很奇怪,因为整个功能都是异步的。
最佳答案
我遇到过类似的问题:
在主 UI 线程上,调用:
dispatch_semaphore_wait(loginDoneSemaphore, DISPATCH_TIME_FOREVER)
并使用 Alamofire 调用 http,内部也使用您的 httpRequest.responseJSON
-> 终于在 responseJSON 完成处理程序中找到了从未调用过的代码
-> 导致在 DISPATCH_TIME_FOREVER 之后查找代码从未被调用
-> 最终找到根本原因是:Alamofire 的responseJSON,默认情况下,如果不传入线程/队列,将在Main UI 线程上运行
-> 在调用 Alamofire 之前,在主 UI 线程中使用 DISPATCH_TIME_FOREVER 锁定 UI 线程
-> 所以在 Alamofire 的 responseJSON 之后,它也在主 UI 线程上运行,永远不会调用
-> 我的解决方案是:指定 Alamofire 在另一个线程上做 http 响应:
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]
})
这可能对你引用有用。
->也许你可以用我的方法:为Alamofire的responseJSON设置另一个线程,来解决你的问题。
关于ios - 不调用 responseJSON 的 Alamofire completionHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34691029/
我以 JSON 格式从 Python Flask 发送数据。我能够获取数据,并在本地托管页面 http://127.0.0.1:5000/ 上的检查器中使用 for 循环。但是,当我将相同的 Java
在我的 javascript 文件中,我注意到我的问题出现在 JS 文件的第 19、30 和 35 行。我可以让 responseJson 在 getUserRepos() 函数中登录到控制台,但是如
这是我从我的 API 获取 JSON 数据的代码。我想做的是在我的 Flatlist 中打印各种药物的名称,然后使该对象可点击,这样我就可以在下一页上显示有关它的更多信息。我可以正确接收 JSON 数
我正在使用 Alamofire 尝试使用 image shack API 将图像放在图像棚服务器上。我没有收到回复并收到错误: FAILURE: Error Domain=NSCocoaErrorDo
我想限制 12 个帖子,只显示 post_featured 键值为 1 的精选帖子 componentDidMount() { return fetch(ConfigApp.URL+'json/
我正忙于研究为 Swift 创建的 Alamofire 网络库。我遇到过 responseJSON 函数: public func responseJSON( queue queue:
我正在使用 AlamoFire 调用我的网络服务: ApiManager.manager.request(.GET, webServiceCallUrl, parameters: ["id": 12
我正在尝试在我的应用程序中全局处理所有 ajax 异常。 我有一个简单的验证异常,在 ajax post 请求发送到服务器后抛出。 if (string.IsNullOrEmpty(name)) {
我有这种方法可以联系我的 REST 网络服务。我想在连接失败时生成异常。Xcode 告诉我不能使用函数 throw VendingMachineError.InvalidSelection 因为 me
鉴于以下情况: $(function() { function getTopMod(e) { var requesturl = '/r/lol/about/moderators
我正在开发一个小型网络框架来运行 HCI 研究并遇到以下问题: 我有一个运行 express 的 Node 服务器,用于从 JSON 文件为我的本地主机数据提供服务。不是最好的数据库,但由于它是一个单
我将 sessionManager.request 与 .validate().responseJSON 一起使用 是否可以在将响应传递给 responseJSON 之前修改我从服务器获得的响应?我需
( swift 2.2,Alamofire 3.0) 我有一个相当复杂的错误/状态检查协议(protocol),我在我的许多 REST 调用之后应用它,我自然希望重新使用此代码。 Alamofire.
我有处理位置数据的代码,因此我可以提取可以匿名化数据的详细信息——例如,如果我的地点 API 说它是 _type:“Building”和 building:“Safeway”——我可以保存数据作为纬度
Alamofire.request(todoEndpoint) .responseJSON { response in switch response.resu
我正在使用 alamofire 上传图片。这是注册 API,您可以在其中使用个人资料照片进行注册(这是我必须上传的内容) 所以我的代码是这样的(我将用另一个代码替换 print(JSON);这只是为了
注意:我需要使用 ObjectMapper,而不是 AlamoFireObjectMapper。 如何不去JSON而是从responseJSON数据映射到User?以下是尝试从 responseJSO
我有以下代码来获取对评论列表的回复。 (1条评论多条回复) static func fetchCommentsAndTheirReplies(articleId: String, failure: (
我正在尝试在 javascript 中解析一个 bit.ly JSON 响应。 我通过 XmlHttpRequest 获取 JSON。 var req = new XMLHttpRequest; r
我是 Swift 新手,我正在尝试升级一些旧的 Swift 代码。我收到以下警告: 'responseJSON(queue:dataPreprocessor:emptyResponseCodes:em
我是一名优秀的程序员,十分优秀!