requestAuthorizationToShareTypes之后的延迟

时间:2015-02-17 21:34:52

标签: ios8 hkhealthstore

我正在设置iOS 8应用,要求Heath Kit Store授权共享类型。请求读/写屏幕显示正常,选择完成后,我立即看到完成回调。在这个回调中,我正在推动一个新的视图控制器。我为代码设置了一个断点,该代码以编程方式推送下一个视图控制器,并立即调用,但转换直到大约10秒后才会发生。

一些代码:

@IBAction func enable(sender: AnyObject) {
    let hkManager = HealthKitManager()
    hkManager.setupHealthStoreIfPossible { (success, error) -> Void in
        if let error = error {
            println("error = \(error)")
        } else {
            println("enable HK success = \(success)")
            self.nextStep()
        }
    }
}

func nextStep() {
        self.nav!.pushViewController(nextController, animated: true)
}


class HealthKitManager: NSObject {

    let healthStore: HKHealthStore!

    override init() {
        super.init()
        healthStore = HKHealthStore()
    }

    class func isHealthKitAvailable() -> Bool {
        return HKHealthStore.isHealthDataAvailable()
    }

    func setupHealthStoreIfPossible(completion: ((Bool, NSError!) -> Void)!) {
        if HealthKitManager.isHealthKitAvailable()
        {
            healthStore.requestAuthorizationToShareTypes(dataTypesToWrite(), readTypes: dataTypesToRead(), completion: { (success, error) -> Void in
                completion(success, error)
            })
        }
    }

    func dataTypesToWrite() -> NSSet {
        let runningType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)
        let stepType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)

        return NSSet(objects: runningType, stepType)
    }

    func dataTypesToRead() -> NSSet {
        let runningType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)
        let stepType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)
        let climbedType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierFlightsClimbed)

        return NSSet(objects: runningType, stepType, climbedType)
    }
}

有关导致过渡时间延迟的原因的任何想法?

1 个答案:

答案 0 :(得分:1)

问题是在后台队列中返回完成块。我只是将转换调用放回主队列,如下所示:

hkManager.setupHealthStoreIfPossible { (success, error) -> Void in
        if let error = error {
            println("error = \(error)")
        } else {
            dispatch_async(dispatch_get_main_queue(), {
                println("enable HK success = \(success)")
                self.nextStep()
            });

        }
    }
}