我正在学习如何使用完成处理程序和调度。有一个带有两个可选参数(groupName和groupId)的函数。如果groupName给出,则groupId必须使用此名称检索。
如果需要该方法在继续之前完成,这是我试图等待的,但是信号量只是无限期地等待。
func getTaskId(uid: String, groupName: String?, groupId: String?, taskName: String, handler: @escaping (Array<String>?, Error?) -> Void) {
var id: String? // this is groupId not task id *
let semaphore = DispatchSemaphore(value: 0)
if let groupName = groupName {
getGroupId(uid: uid, groupName: groupName) {(groupId, groupIdErr) in
if let err = groupIdErr {
handler(nil, err)
return
} else {
id = groupId!
semaphore.signal()
}
}
} else if let unwrappedId = groupId {
id = unwrappedId
semaphore.signal()
} else {
let err = xErrors.getTaskIdErr(message: "Failed to get group id")
handler(nil, err)
return
}
semaphore.wait()
guard let finalId = id else {return} // groupId will be used now
// use groupId to continue and get taskId...
}
做这样的事情的正确方法是什么?等待另一种方法的结果,但只需if要这样做。