仅在发出多个请求后调用函数
Call a function after making multiple requests only
我正在使用 for-in
循环使用 Alamofire 为数组中的每个项目发出 HTTP 请求。我想在收到所有回复后调用一个函数:
for product in products {
let requestURL = "http://api.com/" + product
let parameters = ["apiKey" : "myApiKey"]
Alamofire.request(.GET, requestURL, parameters: parameters)
.responseJSON { response in
// do stuff here
}
}
为了在完成后调用一个函数,我想我可以检查 product
是否是数组的最后一个元素,然后如果是这样就调用该函数(因为请求是异步的) .我该怎么做?
您应该使用 GCD 在所有请求完成时得到通知。使用 dispatch_group_create
和 dispatch_group_notify
。有关实施细节,请查看此 thread.
链接线程中的示例代码:
func downloadAllData(allDataDownloadedCompletionHandler:()->Void) {
let dispatchGroup: dispatch_group_t = dispatch_group_create()
let types = ["one", "two", "three"] // there are actually about 10 requests called, but to make it simple I set it to 3
for type in types {
// enter group and run request
dispatch_group_enter(dispatchGroup)
self.downloadDataForType(type, group: dispatchGroup)
}
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), {
allDataDownloadedCompletionHandler()
});
}
func downloadDataForType(type:String, group: dispatch_group_t) {
Alamofire.request(Router.TypeData(type: type)).response({ (request, response, xmlResponse, error) -> Void in
// request finished
println("Data for type \(type) downloaded")
// let's parse response in different queue, because we don't want to hold main UI queue
var db_queue = dispatch_queue_create("db_queue", nil)
dispatch_async(db_queue, {
if response?.statusCode == 200 {
saveToDatabase(xmlResponse)
}
// leave group
dispatch_group_leave(group)
})
})
}
我正在使用 for-in
循环使用 Alamofire 为数组中的每个项目发出 HTTP 请求。我想在收到所有回复后调用一个函数:
for product in products {
let requestURL = "http://api.com/" + product
let parameters = ["apiKey" : "myApiKey"]
Alamofire.request(.GET, requestURL, parameters: parameters)
.responseJSON { response in
// do stuff here
}
}
为了在完成后调用一个函数,我想我可以检查 product
是否是数组的最后一个元素,然后如果是这样就调用该函数(因为请求是异步的) .我该怎么做?
您应该使用 GCD 在所有请求完成时得到通知。使用 dispatch_group_create
和 dispatch_group_notify
。有关实施细节,请查看此 thread.
链接线程中的示例代码:
func downloadAllData(allDataDownloadedCompletionHandler:()->Void) {
let dispatchGroup: dispatch_group_t = dispatch_group_create()
let types = ["one", "two", "three"] // there are actually about 10 requests called, but to make it simple I set it to 3
for type in types {
// enter group and run request
dispatch_group_enter(dispatchGroup)
self.downloadDataForType(type, group: dispatchGroup)
}
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), {
allDataDownloadedCompletionHandler()
});
}
func downloadDataForType(type:String, group: dispatch_group_t) {
Alamofire.request(Router.TypeData(type: type)).response({ (request, response, xmlResponse, error) -> Void in
// request finished
println("Data for type \(type) downloaded")
// let's parse response in different queue, because we don't want to hold main UI queue
var db_queue = dispatch_queue_create("db_queue", nil)
dispatch_async(db_queue, {
if response?.statusCode == 200 {
saveToDatabase(xmlResponse)
}
// leave group
dispatch_group_leave(group)
})
})
}