我想知道以下场景。
我有一个DispatchGroup内部函数。现在我正在后台线程上进入该组并调用wait().
func test() {
let group = DispatchGroup()
DispatchQueue.global().async {
group.enter()
group.wait()
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在主线程离开函数后,该组是否会永远等待或被释放?
我不确定是否有任何引用或捕获。我会非常感谢一些解释,这个话题让我有点困惑。
先感谢您!
concurrency multithreading grand-central-dispatch swift dispatchgroup
我有三个变量a,b和c。我有三个带有完成块的异步函数来更新这些变量,另外三个函数只处理一些数据。
我确保工作函数等到所有数据都更新为DispatchGroup.
// The Data
var a: String?
var b: String?
var c: String?
// The Update
let group = DispatchGroup()
group.enter()
updateA() {
group.leave()
}
group.enter()
updateB() {
group.leave()
}
group.enter()
updateC() {
group.leave()
}
group.wait()
// The work
doSomthingWith(a: a, b: b)
doSomethingElseWith(b: b, c: c)
doAnotherThingWith(a: a, c: c)
Run Code Online (Sandbox Code Playgroud)
我希望能够做的是在参数更新后调用每个工作函数,而不是等待一切。这只是一个(显然)简化版本。可能有更多的变量和函数。
我正在使用斯威夫特。提前谢谢了。
我在控制器中有多个 api,成功响应后我必须重新加载UITableView.
现在我从两个 api 开始,第二个 api 依赖于第一个 usingBlockOperation和DispatchGroupin it。
首先在viewDidLoad:
getDataFromAllApis {
self.tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)
然后我添加了方法:
func getDataFromAllApis(completion: @escaping (() -> Void)) {
let queue = OperationQueue()
let getFirstDataOperation = BlockOperation {
let group = DispatchGroup()
group.enter()
self.getFirstDataFromApi {
group.leave()
}
group.wait()
}
queue.addOperation(getFirstDataOperation)
let getSecondDataOperation = BlockOperation {
let group = DispatchGroup()
group.enter()
self.getSecondDataFromApi {
group.leave()
}
group.notify(queue: .main) {
completion()
}
}
queue.addOperation(getSecondDataOperation)
getSecondDataOperation.addDependency(getFirstDataOperation)
}
Run Code Online (Sandbox Code Playgroud)
我在这里面临的问题是 getSecondDataOperation 首先执行并返回到 tableview 重新加载部分。
我在这里遗漏了什么还是可以有不同的方法?任何帮助将不胜感激。 …