HKSampleQuery无法重复使用


  1. 为权重创建一个HKSampleQuery(但不执行它(
  2. 根据重量创建并执行HKObserver查询
  3. 在观察者查询的updateHandler中,执行权重示例查询

第一次执行示例查询时运行良好。

下次执行示例查询时,我会得到一个异常:"…'NSInvalidArgumentException',原因:'您无法启动已激活的查询'">

如果每次在observer更新处理程序中都创建一个新的示例查询,然后执行它,那么它就可以正常工作。

似乎我应该能够重用示例查询的第一个实例;没有任何相反的记载。

class HealthDemoC {
    let store = HKHealthStore()
    let wtType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)!
    var wtObserverQ: HKObserverQuery! = nil
    var wtSampleQ: HKSampleQuery! = nil
    init() {
        print("init: HealthDemoC")
        // !! only instantiating the query here and then executing repeatedly in observerUpdateHandler fails
        wtSampleQ = HKSampleQuery(sampleType: wtType, predicate: nil, limit: 0, sortDescriptors: nil, resultsHandler: wtResultsHandler)
        wtObserverQ = HKObserverQuery(sampleType: wtType as HKSampleType, predicate: nil, updateHandler: observerUpdateHandler)
        store.executeQuery(wtObserverQ)
    }
    func observerUpdateHandler (query: HKObserverQuery,
        completion: HKObserverQueryCompletionHandler,
        error: NSError?) {
            print("clbk: observerUpdateHandler")
            // instantianting a new query with each call to observerUpdateHandler works
            // wtSampleQ = HKSampleQuery(sampleType: wtType, predicate: nil, limit: 0, sortDescriptors: nil, resultsHandler: wtResultsHandler)
            store.executeQuery(wtSampleQ)
            completion()
    }
    func wtResultsHandler(query: HKSampleQuery, results: [HKSample]?, error: NSError?) {
        print("clbk: wtResultsHandler - (results!.count)) results")
        // stopping the query doesn't prevent the exception
        // store.stopQuery(query)
    }
}

虽然官方文档中没有,但异常本身就是一种文档形式,它明确地"告诉"您预期的行为是什么。当您需要再次运行观察者查询时,您应该在完成时使用相同的参数重新实例化该查询。

相关内容

  • 没有找到相关文章

最新更新