等待具有异步操作的功能完成

时间:2017-08-31 07:57:59

标签: swift asynchronous swift3 grand-central-dispatch

我如何等待自己完成异步操作的函数?

让我举个例子:

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
    }
}

1 个答案:

答案 0 :(得分:1)

没有代码很难理解发生了什么。如果您查看Using dispatch groups to wait for multiple web services,您会发现正在发生的事情。

否则,您可以开始使用NSOperationNSOperationQueue。实际上,如果您有两个操作,则可以在它们之间添加依赖关系。换句话说,您可以说操作只能在它所依赖的操作完成后才能开始执行。除此之外,操作还具有可取消的好处。例如,当您想要处理用户操作时很有用。 NSOperation and NSOperationQueue Tutorial in Swift将为您提供有关如何使用它们的非常好的介绍。

我想强调的是操作是一个操作(特别是当你将它子类化时)代表一个可以重复使用的自包含任务 - 在你的项目中或在不同的项目中。