Ios 使用dispatchgroup在for循环中等待任务完成,如果失败则退出循环
我试图根据条件退出for循环,但我遇到了这个问题,因为它甚至没有退出循环。 这是我的代码循环Ios 使用dispatchgroup在for循环中等待任务完成,如果失败则退出循环,ios,swift,for-loop,dispatchgroup,Ios,Swift,For Loop,Dispatchgroup,我试图根据条件退出for循环,但我遇到了这个问题,因为它甚至没有退出循环。 这是我的代码循环 var isFailure = true let dispatchGroup = DispatchGroup() var myFailureTask: Int? for item in 1...5 { dispatchGroup.enter() test(item: item, completion: { print("Success\(item)") dis
var isFailure = true
let dispatchGroup = DispatchGroup()
var myFailureTask: Int?
for item in 1...5 {
dispatchGroup.enter()
test(item: item, completion: {
print("Success\(item)")
dispatchGroup.leave()
}, failureBlock: {
print("Failure\(item)")
myFailureTask = item
dispatchGroup.leave()
return
})
dispatchGroup.wait()
}
dispatchGroup.notify(queue: .main) {
if let myFailure = myFailureTask {
print("task failure \(myFailure)")
} else {
print("all task done")
}
}
func test(item: Int,completion: @escaping(() -> ()), failureBlock: @escaping(() -> ())) {
Thread.sleep(forTimeInterval: TimeInterval(item))
isFailure = !isFailure
if isFailure {
failureBlock()
} else {
completion()
}
}
返回
从当前范围返回
在本例中,它是从failureBlock:{}
返回的,而不是从for循环范围返回的
你必须重构代码来实现你想要做的事情
(如果此代码同步执行)您可以通过设置函数的返回类型Bool
并删除failureBlock
参数,从函数返回success
值true
|false
或者(如果此代码是异步执行的),您必须考虑在触发另一个任务之前等待一个任务完成/失败
更新
我认为下面可能是这段代码的简化版本-
var isFailure: Bool = false
func callTest(for item: Int) {
print("task initiated \(item)")
test(item: item, completion: {
print("task succeeded \(item)")
if item < 5 {
callTest(for: item+1)
} else {
print("all tasks done")
}
}, failureBlock: {
print("task failed \(item)")
})
}
func test(item: Int, completion: @escaping (() -> Void), failureBlock: @escaping (() -> Void)) {
Thread.sleep(forTimeInterval: TimeInterval(item))
isFailure.toggle()
if isFailure {
failureBlock()
} else {
completion()
}
}
callTest(for: 1)
var isFailure:Bool=false
func callTest(用于项:Int){
打印(“任务已启动\(项目)”)
测试(项目:项目,完成:{
打印(“任务成功\(项目)”)
如果项目<5{
callTest(用于:项目+1)
}否则{
打印(“所有任务已完成”)
}
},故障块:{
打印(“任务失败\(项目)”)
})
}
功能测试(项目:Int,完成:@escaping(()->Void),故障块:@escaping(()->Void)){
睡眠(时间间隔:时间间隔(项))
isFailure.toggle()
如果是失败{
失效块()
}否则{
完成()
}
}
呼叫测试(适用于:1)
您需要在循环中的某个地方有一个中断
来退出它,但是中断
需要放在循环的同步部分。顺便说一句,你为什么需要打破循环,你试图解决的问题是什么?当循环中的一个项目作为API调用失败取决于循环中前一个项目的成功时,我需要退出循环。然后这个--应该会帮助你。我只是做了一些更改,工作得很有魅力。谢谢@CristikThanks。在我的测试函数中,将有一个异步任务,即API调用,第二个任务将取决于前一个任务。有没有办法从循环中返回?我认为这可以简化-请参阅我答案的更新。
var isFailure = false
let dispatchGroup = DispatchGroup()
var myFailureTask: Int?
for item in 1...5 {
dispatchGroup.enter()
test(item: item, completion: {
print("Success\(item)")
dispatchGroup.leave()
}, failureBlock: {
print("Failure\(item)")
myFailureTask = item
dispatchGroup.leave()
})
if isFailure == true {
break
}
dispatchGroup.wait()
}
dispatchGroup.notify(queue: .main) {
if let myFailure = myFailureTask {
print("task failure \(myFailure)")
} else {
print("all task done")
}
}
func test(item: Int,completion: @escaping(() -> ()), failureBlock: @escaping(() -> ())) {
Thread.sleep(forTimeInterval: TimeInterval(item))
isFailure = !isFailure
if isFailure {
failureBlock()
} else {
completion()
}
}```
Made few changes work like a charm.
Any one has better idea please comment