[英]OperationQueue / DispatchGroup and recursion
我在理解對API進行異步,遞歸調用時如何使用GCD時遇到問題。
以下是三種包含相同邏輯的相似方法之一,僅適用於不同的數據和API端點。 如果沒有下一頁請求,則該方法應完成,然后下一個方法應開始。
我將如何確保fetchItems2
被調用后fetchItems1
完成,並fetchItems3
后fetchItems2
?
private func fetchItems1(completion: @escaping (Error?) -> Void) {
var _items = [Item]()
func handleReceivedItemsPage(_ page: PagingObject<Item>, _completion: ((Error?) -> Void)?) {
let newItems = page.items!
_tracks.append(contentsOf: newTracks)
if page.canMakeNextRequest {
page.getNext(success: { nextPage in
handleReceivedItemsPage(nextPage)
}) { nextError in
_completion?(nextError)
}
} else {
// Finished, next method can now start
self.items = _items
_completion?(nil)
}
}
API.getSavedItems(success: { page in
handleReceivedItemsPage(page, _completion: completion)
}, failure: completion)
}
private func fetchItems2(completion: @escaping (Error?) -> Void)) { ... }
private func fetchItems3(completion: @escaping (Error?) -> Void)) { ... }
您可以保留一個額外的變量,以跟蹤API調用何時完成。 在完成塊中,遞增此變量。 然后,當變量達到完成的API調用數量時,執行您的任務。
我會用DispatchGroup :
public void FetchItems(completion: @escaping (Error?) -> Void) {
let group = DispatchGroup()
group.enter()
fetchItems1() { error in
completion(error)
group.leave()
}
group.wait()
group.enter()
fetchItems2() { error in
completion(error)
group.leave()
}
// 3rd function call
}
后代碼group.wait()
不叫,直到數量group.enter()
和group.leave()
的調用是相等的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.