我需要对数组中的每个元素执行一次异步操作,一次执行一次。此操作将在主队列上回调。
func fetchResults(for: array, completion: () -> Void) {
var results: [OtherObject]: []
let queue = DispatchQueue(label: "Serial Queue")
queue.sync {
let group = DispatchGroup()
for object in array {
group.enter()
WebService().fetch(for: object) { result in
// Calls back on main queue
// Handle result
results.append(something)
group.leave()
}
group.wait()
}
}
print(results) // Never reached
completion()
}
WebService调用没有回叫-我认为这是在告诉我主队列已阻塞,但我不明白为什么。
答案 0 :(得分:3)
您应该使用group.notify()
而不是group.wait()
,因为后者是同步的阻塞操作。
如果您只调度一个工作项一次,我也看不到调度到队列的要点。
func fetchResults(for: array, completion: () -> Void) {
var results: [OtherObject]: []
let group = DispatchGroup()
for object in array {
group.enter()
WebService().fetch(for: object) { result in
// Calls back on main queue
// Handle result
results.append(something)
group.leave()
}
}
group.notify(queue: DispatchQueue.main) {
print(results)
completion()
}
}
答案 1 :(得分:2)
也许这只是一个错字,但是基本上sync
不会发牢骚。
然后代替wait
在循环外部(!)使用notify
并在队列中打印results
。
queue.async {
let group = DispatchGroup()
for object in array {
group.enter()
WebService().fetch(for: object) { result in
// Calls back on main queue
// Handle result
results.append(something)
group.leave()
}
}
group.notify(queue: DispatchQueue.main) {
print(results)
completion()
}
}
答案 2 :(得分:0)
我不认为您的主队列已锁定,否则您的应用程序可能会无限加载,就好像它崩溃了一样(肯定是在MacOS中)。
这对我有用,也许会有所帮助:
class func synchronize(completion: @escaping (_ error: Bool) -> Void) {
DispatchQueue.global(qos: .background).async {
// Background Thread
var error = false
let group = DispatchGroup()
synchronizeObject1(group: group){ error = true }
synchronizeObject2(group: group){ error = true }
synchronizeObject3(group: group){ error = true }
group.wait() // will wait for everyone to sync
DispatchQueue.main.async {
// Run UI Updates or call completion block
completion(error)
}
}
}
class func synchronizeObject1(group: DispatchGroup, errorHandler: @escaping () -> Void){
group.enter()
WebservicesController.shared.getAllObjects1() { _ in
// Do My stuff
// Note: if an error occures I call errorHandler()
group.leave()
}
}
如果我要说的话,它可能来自queue.sync
而不是queue.async
。但是我不是异步调用专家。
希望有帮助