在 swift 中添加一个 BlockOperation 对另一个的依赖性无法正常工作
Adding dependency of one BlockOperation on another is not working properly in swift
我在控制器中有多个 api,成功响应后我必须重新加载 UITableView
。
现在我从两个 api 开始,第二个 api 依赖于第一个使用 BlockOperation
和 DispatchGroup
的第一个。
viewDidLoad
第一名:
getDataFromAllApis {
self.tableView.reloadData()
}
然后我添加了方法:
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)
}
我在这里面临的问题是 getSecondDataOperation 首先执行,returns 到 tableview 重新加载部分。
我是不是遗漏了什么,或者可以有不同的方法吗?任何帮助将不胜感激。
我试过这个 post :
你想多了。只需从第一个 API 的完成处理程序中调用第二个 API。没有操作,没有调度组,什么都没有。
self.getFirstDataFromApi {
self.getSecondDataFromApi {
// call the completion handler
}
}
至于为什么你的代码不起作用,那是因为你没有按照链接的答案所说的去做!
它说要这样做:
getSecondDataOperation.addDependency(getFirstDataOperation)
queue.addOperation(getFirstDataOperation)
queue.addOperation(getSecondDataOperation)
那不是你做的。你这样做了:
queue.addOperation(getFirstDataOperation)
queue.addOperation(getSecondDataOperation)
getSecondDataOperation.addDependency(getFirstDataOperation) // too late
(但是,post 虽然巧妙,但不是我在这种情况下会做的。如果我想顺序下载操作,我会使用这里描述的技术:https://fluffy.es/download-files-sequentially/. Or, in iOS 13, I'd use the Combine framework, as I describe here: 。 )
我在控制器中有多个 api,成功响应后我必须重新加载 UITableView
。
现在我从两个 api 开始,第二个 api 依赖于第一个使用 BlockOperation
和 DispatchGroup
的第一个。
viewDidLoad
第一名:
getDataFromAllApis {
self.tableView.reloadData()
}
然后我添加了方法:
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)
}
我在这里面临的问题是 getSecondDataOperation 首先执行,returns 到 tableview 重新加载部分。
我是不是遗漏了什么,或者可以有不同的方法吗?任何帮助将不胜感激。
我试过这个 post :
你想多了。只需从第一个 API 的完成处理程序中调用第二个 API。没有操作,没有调度组,什么都没有。
self.getFirstDataFromApi {
self.getSecondDataFromApi {
// call the completion handler
}
}
至于为什么你的代码不起作用,那是因为你没有按照链接的答案所说的去做!
它说要这样做:
getSecondDataOperation.addDependency(getFirstDataOperation)
queue.addOperation(getFirstDataOperation)
queue.addOperation(getSecondDataOperation)
那不是你做的。你这样做了:
queue.addOperation(getFirstDataOperation)
queue.addOperation(getSecondDataOperation)
getSecondDataOperation.addDependency(getFirstDataOperation) // too late
(但是,post 虽然巧妙,但不是我在这种情况下会做的。如果我想顺序下载操作,我会使用这里描述的技术:https://fluffy.es/download-files-sequentially/. Or, in iOS 13, I'd use the Combine framework, as I describe here: