[英]Swift 4 async call with for loop execute in order using DispatchGroup, DispatchQueue and DispatchSemaphore
[英]using dispatchgroup wait for task completion in for loop and exit from loop if failure
我试图根据条件从 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()
}
}
return
从当前 scope 返回。
在这种情况下,它从failureBlock: {}
返回,而不是从 for 循环 scope 返回。
您必须重构代码以实现您想要做的事情。
要么(如果此代码同步执行)您可以返回success
值true
| 通过使function
的返回类型为Bool
并删除failureBlock
参数,从 function 中返回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 = 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.