ios - 如何等待异步函数 Swift

标签 ios swift

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

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”函数?

最佳答案

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

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

}

关于ios - 如何等待异步函数 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31551112/

相关文章:

iphone - 在 Objective-C 中,在每个类中导入相同的 header 会使编译时间变长?

swift - NSDocument选项卡窗口恢复

loops - 快速循环遍历字典

ios - 由于 cocoa pod 中的内部保护错误快速类功能而无法访问

swift - 简单的 Swift 类不编译

ios - 春萌要连动动画?

ios - 为什么文字是颠倒的?

ios - UIImage(contentsOfFile :) returning nil despite file existing in caches directory

ios - NSInvocation/invoke 对的 addTarget 失败

ios - 将模型类传递给嵌套方法时出现 Swift 泛型方法问题