Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用dispatchgroup在for循环中等待任务完成,如果失败则退出循环_Ios_Swift_For Loop_Dispatchgroup - Fatal编程技术网

Ios 使用dispatchgroup在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

我试图根据条件退出for循环,但我遇到了这个问题,因为它甚至没有退出循环。 这是我的代码循环

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