我如何等待自己完成异步操作的函数?
让我举个例子:
Function_A
从图库中提取照片。使用提取闭包异步执行提取操作。
我在Function_A
中呼叫Function_B
,我想等待照片抓取操作完成,然后继续我的代码。
我尝试过的事情:
我已经使用过调度组,但它没有用。我还尝试在同步块中调用Function_A
,但这也不成功。
我该如何等待此操作完成?由于将提取操作运行到另一个队列,可能是这个问题吗?
更新:
这就是我所做的:
class imageFetch: NSObject{
var theImage: PHAsset? = nil
func Function_A(){
let fetchOption = PHFetchOptions()
PHPhotoLibrary.requestAuthorization { (authStatus) in
// It seems code will be executed asynchronously from here
if authStatus == .authorized{
let imageAsset = PHAsset.fetchAssets(with: .image, options: fetchOption)
// Select image and save it in theImage
// I know I can send a closure and run it here
}
}
}
}
在另一个课程中,我称之为该职能:
class edit: NSObject{
funct Function_B(){
var imageFetchIns = imageFetch()
// I want below code to execute asynchronously
imageFetchIns.Function_A()
// Now I want to wait last operation to finish
}
}
答案 0 :(得分:1)
没有代码很难理解发生了什么。如果您查看Using dispatch groups to wait for multiple web services,您会发现正在发生的事情。
否则,您可以开始使用NSOperation
和NSOperationQueue
。实际上,如果您有两个操作,则可以在它们之间添加依赖关系。换句话说,您可以说操作只能在它所依赖的操作完成后才能开始执行。除此之外,操作还具有可取消的好处。例如,当您想要处理用户操作时很有用。
NSOperation and NSOperationQueue Tutorial in Swift将为您提供有关如何使用它们的非常好的介绍。
我想强调的是操作是一个操作(特别是当你将它子类化时)代表一个可以重复使用的自包含任务 - 在你的项目中或在不同的项目中。