簡體   English   中英

OperationQueue / DispatchGroup和遞歸

[英]OperationQueue / DispatchGroup and recursion

我在理解對API進行異步,遞歸調用時如何使用GCD時遇到問題。

以下是三種包含相同邏輯的相似方法之一,僅適用於不同的數據和API端點。 如果沒有下一頁請求,則該方法應完成,然后下一個方法應開始。

我將如何確保fetchItems2被調用后fetchItems1完成,並fetchItems3fetchItems2

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM