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 ' - 所以我不確定你的意思是說使用它 –
在你的例子中找不到信號量。你能告訴我 - 你在哪裏使用它? –
你是對的,沒有信號量 - 我的不好 –