我正在尝试使用Dispatch组在任务完成运行时通知我。我已经写了一个我想完成的简单伪指令。由于某种原因,我的notify函数首先被调用。
class Main {
let cats = Cats()
let all = ALL.singleton
viewdidLoad(){
cats.makeAllCall
all.dis()
}
}
class Cats {
let dispatch = DispatchGroup()
let all = ALL.singleton
func makeAllCall(){
for i in 1...10{
all.callInfo()
print("hello")
}
}
}
class ALL {
static let singleton = ALL()
let dispatch = DispatchGroup()
func dis(){
dispatch.notify(.main){
print("working")
}
}
func callInfo(){
dispatch.enter()
Alamofire.request("url", headers: headers).responseJSON { response in
if response.result.isSuccess{
completion(JSON(response.result.value!))
}else{
print("Binance - Couldn't import Request: Please check your internet connection")
}
}
dispatch.leave()
}
}
答案 0 :(得分:1)
您还不了解调度组的工作方式。您正在呼叫dis()
,显然是相信dispatch.notify
是您所称的东西。不是。当每个enter
被一个leave
平衡后,就会为您调用。一个典型的结构看起来像这样的伪代码:
let group = DispatchGroup()
// here we go...
group.enter()
_queue1_.async {
// ... do task here ...
group.leave()
}
group.enter()
_queue2_.async {
// ... do task here ...
group.leave()
}
group.enter()
_queue3_.async {
// ... do task here ...
group.leave()
}
// ... more as needed ...
group.notify(queue: DispatchQueue.main) {
// finished!
}
您需要摆脱这种奇怪的类结构,并将所有东西(调度组,enter
和leave
调用以及notify
块)放在一个地方。如果您不想这样做,那么这不是对调度组的好用(也许您想要的是像Operation和OperationQueue这样的东西)。