2016-09-16 100 views
4

我有一個情況我需要兩個HTTP GET請求,並處理它們的結果都完成之後。我對每個單獨的網絡請求都有一個完成處理程序,但它沒有幫助,因爲我不知道何時檢索到這兩個請求的數據。需要同時做兩個HTTP網絡請求(與完成處理程序一旦完成兩者)

我已經用有限GCD,但現在,斯威夫特3出來了,我試圖找出如何運行多個任務,並有一個完成處理程序爲他們的經驗。我的研究表明,GCD或NSOperationQueue可能是我正在尋找的解決方案。任何人都可以幫助建議哪些工具適合這項工作,以及Swift 3中的代碼可能是什麼樣子?

+0

GCD或NSOperationqueue都可以使用。 GCD:檢查了這一點[http://stackoverflow.com/questions/37805885/how-to-create-dispatch-queue-in-swift-3][1] – user6837640

回答

12

你應該使用調度組,進入組發出請求之前,和離開該組中的請求完成處理。所以,讓我們假設,第二,你有這樣的執行異步請求的一些方法,但提供的,這是一個將被調用時,網絡請求進行封閉完成處理程序參數:

func perform(request: URLRequest, completionHandler: @escaping() -> Void) { ... } 

啓動他們完成時,這兩個併發請求,並且被通知,你會做這樣的事情:

let group = DispatchGroup() 

group.enter() 
perform(request: first) { 
    group.leave() 
} 

group.enter() 
perform(request: second) { 
    group.leave() 
} 

group.notify(queue: .main) { 
    print("both done") 
} 

顯然,你的perform(request:)實現可能顯著變化(例如,您可能具有關閉將數據傳遞迴),但無論您是使用URLSession編寫自己的網絡代碼,還是使用相同的模式,或者使用Alamofire。只需使用GCD組,在創建請求時輸入組,並將該組留在異步請求的完成處理程序中。

+0

不group.notify的關閉實質上充當完成處理一次添加到該組的任務都完成了嗎?另外,當我們進入小組的閉包時,它是如何知道要阻止執行直到我們完成所有請求的添加?我問,因爲如果它在我添加第二個請求之前完成第一個請求,並且在第二個請求仍在等待時調用通知。這通常不是問題嗎? –

+0

是的,當所有'enter'調用與相應的'leave'調用保持平衡時,調用閉包。因此,只有在收到所有'leave'調用後,纔會調用dispatch組'notify'塊。 – Rob

+0

我道歉的問題攻勢,但不會意味着它可能是第一個函數離開該組,並進入該組的第二個功能前通知被叫什麼名字? –

-1

來源:How do I write dispatch_after GCD in Swift 3? 您可以使用dispatch_group。 例如(ObjC代碼):

dispatch_group_t group = dispatch_group_create(); 

//startOperation1 
dispatch_group_enter(group); 

//finishOpeartion1 
dispatch_group_leave(group); 


//startOperation2 
dispatch_group_enter(group); 

//finishOpeartion2 
dispatch_group_leave(group); 


//Handle both operations completion 
dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
//code here 
}); 
相關問題