我的申请中有四个不同的请求,其中三个只需要一个电话,最后一个需要1到10个。
在我遍历数据并进行调用时,一切正常,直到最后一个请求。这是我在 Class1 :
中的代码var data = ...
var points = ...
// I create a new group
let getPointGroup = dispatch_group_create()
// I iterate through my data
for d in data{
// I enter the group
dispatch_group_enter(getPointGroup)
dataService.getPoints(d.point), success: { points -> Void in
points.append(points)
// I leave the group so that I go to the next iteration
dispatch_group_leave(getPointGroup)
}
}
Alamofire请求在 Class2 :
中看起来像这样let headers = [
"Authorization": "Bearer \(token)",
"Content-Type": "application/x-www-form-urlencoded"
]
Alamofire.request(.GET, url, headers:headers)
.responseJSON { response in
switch response.result {
case .Success:
let json = JSON(data: response.data!)
print(json)
success(json)
case .Failure(let error):
print(error)
}
}
但是我从来没有点过GET请求,如果我完全删除了迭代,只要它完美地运行就调用Alamofire请求。
有关如何解决Alamofire迭代请求的任何想法?
修改
不是真的重复,我在不同的类中有下面的片段,示例并没有真正解决我的问题
答案 0 :(得分:2)
如果没有运行,如果在主线程上使用dispatch_group_wait
,则可能会死锁,从而阻塞该线程,并阻止Alamofire运行任何完成处理程序(也需要主线程)。这已经解决了(假设您确实使用dispatch_group_wait
),将其替换为dispatch_group_notify
。
因此:
let group = dispatch_group_create()
for d in data {
// I enter the group
dispatch_group_enter(group)
dataService.getPoints(d.point)) { additionalPoints, error in
defer { dispatch_group_leave(group) }
guard let let additionalPoints = additionalPoints else {
print(error)
return
}
points.append(additionalPoints)
}
}
dispatch_group_notify(group, dispatch_get_main_queue()) {
// go to the next iteration here
}
其中:
func getPoints(point: WhateverThisIs, completionHandler: (JSON?, NSError?) -> ()) {
let headers = [
"Authorization": "Bearer \(token)"
]
Alamofire.request(.GET, url, headers: headers)
.responseJSON { response in
switch response.result {
case .Success:
let json = JSON(data: response.data!)
completionHandler(json, nil)
case .Failure(let error):
completionHandler(nil, error)
}
}
}
现在,我不知道你的各种参数类型是什么,所以我只能猜测,所以不要迷失在那里。但关键是(a)你应该确保你的Alamofire方法中的所有路径都会调用完成处理程序; (b)调用者应该使用dispatch_group_notify
而不是dispatch_group_wait
,以避免阻塞任何线程。
注意,为了使完成处理程序可以调用,即使网络请求失败,我也必须使该闭包的参数可选。当我在那里时,我也添加了一个可选的错误参数。
上述示例中包含的一些不相关的更改:
我建议为闭包的参数使用不同的变量名。原始代码段中的points.append(points)
表示您的points
数组与关闭时传回的points
之间存在一些混淆。
您无需设置Content-Type
标题,因为Alamofire会为您执行此操作。
我没有在上面更改它,但使用responseJSON
(使用NSJSONSerialization
解析JSON)然后使用SwiftyJSON解析原始{{1}是低效的}再次与data
。就个人而言,我不打扰SwiftyJSON,但如果你想使用它,我建议使用Alamofire的NSJSONSerialization
方法而不是response
。解析JSON两次没有意义。