2
这是设置。我有一个方法有一个完成块,我想返回一个列表Item
s。这些Item
是从API中提取的。我希望每个提取都是异步发生的,但最终都会一起返回。如何在完成块之前解析嵌套异步调用
这是我有:
public static func fetchItems(numberOfItems: Int, completion: ([Item]?, NSError?) ->()) -> Void {
var items: [Item] = []
let group = dispatch_group_create()
for (var itemId = 0; itemId < numberOfItems; itemId++) {
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
APIManager.fetchItemWithId(itemId) {
(item, error) in
guard let item = item else {
// handle error
}
print("Item \(itemId) downloaded")
items.append(item)
}
}
}
dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
completion(items, nil)
}
}
我的输出端起来:
nil
Item 0 downloaded
Item 1 downloaded
Item 2 downloaded
etc
虽然我派遣了Item
小号异步的来电,电话本身具有内的另一个异步操作 - 在示例中由APIManager.fetchItemWithId
说明。因此,最终,我的completion
在API请求解析之前被击中。
缺少什么我在这里?
我使用的方法'dispatch_semaphore_t ' - 所以我不确定你的意思是说使用它 –
在你的例子中找不到信号量。你能告诉我 - 你在哪里使用它? –
你是对的,没有信号量 - 我的不好 –