如何等待异步函数 Swift

Posted

技术标签:

【中文标题】如何等待异步函数 Swift【英文标题】:How to Wait for Asynchronous Function Swift 【发布时间】:2015-07-21 23:02:54 【问题描述】:

我有一个收集步骤数据的函数,但我需要一种方法让它在循环之前等待其查询完成。我意识到关于这个问题还有其他问题,但我不知道如何解决它。函数如下:

func stepsAllTime(completion: (Double, NSError?) -> () ) 
    var stopStart = true
    while stopStart 

        x += -1
        // The type of data we are requesting
        let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)
        var daysAgo = x
        var daysSince = x + 1
        var daysSinceNow = -1 * daysAgo
        checker = allTimeSteps.count

        // Our search predicate which will fetch data from now until a day ago
        let samplePredicate = HKQuery.predicateForSamplesWithStartDate(NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitDay, value: daysAgo, toDate: NSDate(), options: nil), endDate: NSCalendar.currentCalendar().dateByAddingUnit(.CalendarUnitDay, value: daysSince, toDate: NSDate(), options: nil), options: .None)

        // The actual HealthKit Query which will fetch all of the steps and sub them up for us.
        let stepQuery = HKSampleQuery(sampleType: sampleType, predicate: samplePredicate, limit: 0, sortDescriptors: nil)  query, results, error in
            var steps: Double = 0


            if results?.count > 0 
                for result in results as! [HKQuantitySample] 
                    steps += result.quantity.doubleValueForUnit(HKUnit.countUnit())
                
            

            completion(steps, error)
            self.allTimeStepsSum += steps
            self.allTimeSteps.append(steps)
            println("New Sum:")
            println(self.allTimeStepsSum)
            println("Days Since Today:")
            println(daysSinceNow)
            if !(self.allTimeStepsTotal > self.allTimeStepsSum) 
                stopStart = false
            
        
        if allTimeStepsTotal > allTimeStepsSum 

            self.healthKitStore.executeQuery(stepQuery)

        

    


如何做到这一点? Swift 中是否有某种“On Complete”功能?

【问题讨论】:

要明确一点...您希望在执行下一个 while stopStart 传递之前调用您的 stepQuery 完成闭包? 【参考方案1】:

我假设我的评论是准确的。 您可能想看一下递归模式,如下所示:

import HealthKit

class Person 

    var nbSteps: Double = 0

    func fetchInfo() -> Void 
        let sampleType = HKSampleType()
        let samplePredicate: NSPredicate? = nil // Your predicate
        let stepQuery = HKSampleQuery(
            sampleType: sampleType,
            predicate: samplePredicate,
            limit: 0,
            sortDescriptors: nil)  (sampleQuery, object, error) -> Void in
                self.nbSteps += 1 // or the value you're looking to add

                dispatch_async(dispatch_get_main_queue(),  () -> Void in // Dispatch in order to keep things clean
                    self.fetchInfo()
                )
        
    


【讨论】:

【参考方案2】:

您可以通过实现回调使程序等待查询完成。

您可以在以下博客文章中了解更多信息 http://www.charles-socrates-chandler.com/blog/2015/2/10/callbacks-in-swift

【讨论】:

如果你没有注意到,我的函数中已经有了这个,但它没有帮助。

以上是关于如何等待异步函数 Swift的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 C# 异步等待

等待 Parse Async 函数在 Swift 中完成

Swift 4:创建一个异步串行队列,每个作业后等待2秒钟

如何使用回调在任何函数中调用异步等待方法

如何在执行函数之前等待 Swift 中的变量? (迅速)

如何在异步等待函数中返回值?