助けてくれてありがとう、私は2つのAPI呼び出しを持っています。両方が同時で、どの呼び出しも最初に成功する可能性があります(順番に呼び出したくない)。 、これが私のコードですが、これが正しい方法かどうか、そしてtableViewをリロードしてアクティビティインジケーターを停止する方法がわかりません。
func downloadDetails(){
let operationQueue: OperationQueue = OperationQueue()
let operation1 = BlockOperation() {
WebServiceManager.getAData(format:A, withCompletion: {(data: Any? , error: Error?) -> Void in
if let success = data {
DispatchQueue.main.async {
(success code)
}
}
})
let operation2 = BlockOperation() {
webServiceManager.getBData(format: B, withCompletion: {(data: Any? , error: Error?) -> Void in
if let success = data {
DispatchQueue.main.async {
(success code)
}
}
})
}
operationQueue.addOperation(operation2)
}
operationQueue.addOperation(operation1)
}
downloadDetails() "calling function"
これはまさにDispatchGroup
の使用例です。通話ごとにグループを入力し、通話が終了したらグループを離れ、すべてが完了したときに通知ハンドラーを追加します。別の操作キューは必要ありません。これらはすでに非同期操作です。
func downloadDetails(){
let dispatchGroup = DispatchGroup()
dispatchGroup.enter() // <<---
WebServiceManager.getAData(format:A, withCompletion: {(data: Any? , error: Error?) -> Void in
if let success = data {
DispatchQueue.main.async {
(success code)
dispatchGroup.leave() // <<----
}
}
})
dispatchGroup.enter() // <<---
webServiceManager.getBData(format: B, withCompletion: {(data: Any? , error: Error?) -> Void in
if let success = data {
DispatchQueue.main.async {
(success code)
dispatchGroup.leave() // <<----
}
}
})
dispatchGroup.notify(queue: .main) {
// whatever you want to do when both are done
}
}
リクエストごとに1つずつ、2つのブール変数を使用するのはどうでしょう。最初の成功コードは変数の1つにtrueを設定し、他の成功コードは2番目の変数に設定します。
チェック関数は、アクティビティインジケーターを停止してテーブルビューを更新する前に、両方の変数が真であることを確認する必要があります。
var success1 = false
var success2 = false
//For the first api call
DispatchQueue.main.async {
success1 = true
successCode()
}
//For the second api call
DispatchQueue.main.async {
success2 = true
successCode()
}
func successCode() {
if ((success1 == true) && (success2 == true)) {
activityIndicator.stopAnimating()
tableView.reloadData()
}
}
OperationQueueを使用します。
実行時間の長いタスクに推奨され、必要に応じてリクエストをキャンセルするように制御できます。
各操作の最後に、操作数をチェックして残りの操作を確認できます。
疑似コードを追加しました。
let operationQueue: OperationQueue = OperationQueue()
func downloadDetails(){
let operation1 = BlockOperation() { [weak self] in
guard let strongSelf = self else {
return
}
sleep(2)
DispatchQueue.main.async {
strongSelf.handleResponse()
}
let operation2 = BlockOperation() { [weak self] in
guard let strongSelf = self else {
return
}
sleep(2)
DispatchQueue.main.async {
strongSelf.handleResponse()
}
}
strongSelf.operationQueue.addOperation(operation2)
}
self.operationQueue.addOperation(operation1)
}
func handleResponse() {
print("OPERATIONS IN PROGRESS: \(self.operationQueue.operations.count)")
if self.operationQueue.operations.count == 0 {
print("ALL OPERATIONS ARE COMPLETE")
}
}
func cancelOperation() {
self.operationQueue.cancelAllOperations()
}
これはプリント
OPERATIONS IN PROGRESS: 1
OPERATIONS IN PROGRESS: 0
ALL OPERATIONS ARE COMPLETE