jye*_*yet 15 grand-central-dispatch swift swift3
在GCD上阅读Swift 3 evolution之后,我正在尝试创建调度组.问题是group.notify(queue:当我DispatchQueue.main作为队列传递时不通知,尽管它确实适用于后台队列.
此外,我不确定我的语法是否正确,因为我试图将代码从Swift 2转换为Swift 3.
typealias CallBack = (result: Bool) -> Void
func longCalculations (completion: CallBack) {
let backgroundQ = DispatchQueue.global(attributes: .qosBackground)
let group = DispatchGroup()
var fill:[Int] = []
for item in 0...200 {
group.enter()
if item > 50 {
fill.append(item)
}
group.leave()
}
//Below in the notify argument If I pass `backgroundQ`, it seems to work correctly but not when DispatchQueue.main is passed.
Run Code Online (Sandbox Code Playgroud)
此代码不起作用
group.notify(queue: DispatchQueue.main, execute: {
completion(result: true)
})
}
Run Code Online (Sandbox Code Playgroud)
这工作正常
group.notify(queue: backgroundQ, execute: {
completion(result: true)
})
}
_______________________________________________________
longCalculations() { print($0) }
Run Code Online (Sandbox Code Playgroud)
jye*_*yet 30
在阅读了Matt建议的帖子之后,我发现我正在向主队列提交任务,当我要求在主线程本身上得到通知时,它陷入了僵局.
我已经修改了代码,现在它按预期工作了,
typealias CallBack = (result: [Int]) -> Void
func longCalculations (completion: CallBack) {
let backgroundQ = DispatchQueue.global(attributes: .qosDefault)
let group = DispatchGroup()
var fill:[Int] = []
for number in 0..<100 {
group.enter()
backgroundQ.async(group: group, execute: {
if number > 50 {
fill.append(number)
}
group.leave()
})
}
group.notify(queue: DispatchQueue.main, execute: {
print("All Done"); completion(result: fill)
})
}
longCalculations(){print($0)}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12067 次 |
| 最近记录: |