阻止操作立即返回Swift


func fetchPlansOperation(planUUIDs : [String], completion : @escaping([Plan],[Int]) -> Void) {
var plans = [Plan]()
var workoutCountArr = [Int]()
guard let uid = Auth.auth().currentUser?.uid else { return }

let queue = OperationQueue()

let fetchPlansOperation = BlockOperation {
for planUUID in planUUIDs {
REF_PLANS.child(planUUID).observe(.value) { snapshot in
guard let planDictionary = snapshot.value as? [String:Any] else { return }
let plan = Plan(uid : uid, planID: planUUID, dictionary: planDictionary)
print("FETCHED PLANS")
plans.append(plan)
}
}
}

let fetchWorkoutCountOperation = BlockOperation {
for planUUID in planUUIDs {
REF_PLANS.child(planUUID).child("workouts").observe(.value) { snapshot in
let workoutCount = snapshot.children.allObjects.count
print("FETCHED WORKOUTS")
workoutCountArr.append(workoutCount)
}
}
}

queue.addOperations([fetchPlansOperation,fetchWorkoutCountOperation], waitUntilFinished: true)
print("ITS OVER..")


}

上面的代码给了我这个输出:

一切都结束了。

提取训练

提取的计划

我希望Firebase提取结束,然后打印";ITS结束";陈述我需要这些值来执行进一步的API获取。我在这里做错了什么。

我知道区块操作是异步的,这意味着我可以控制什么开始,但不能控制什么结束。有什么方法可以使块操作同步吗。我需要完成这些手术,然后才能做其他事情。我需要获取这些值,然后打印";完成";。任何帮助都将不胜感激。

您可以阻止操作,直到完成:

let fetchPlansOperation = BlockOperation {
let group = DispatchGroup()
for planUUID in planUUIDs {
group.enter()
REF_PLANS.child(planUUID).observe(.value) { snapshot in
guard let planDictionary = snapshot.value as? [String:Any] else { return }
let plan = Plan(uid : uid, planID: planUUID, dictionary: planDictionary)
print("FETCHED PLANS")
plans.append(plan)
group.leave()
}
}
group.wait()
}

对其他操作执行相同操作。

最新更新