HKSampleQuery无法重复使用

时间:2015-09-26 20:01:52

标签: ios health-kit hksamplequery

  1. 为权重创建HKSampleQuery(但不执行它)
  2. 创建并执行HKObserverQuery on weight
  3. 在观察者查询的updateHandler中,执行权重样本查询
  4. 第一次执行示例查询时工作正常。

    下次执行示例查询时,我得到一个异常:“...'NSInvalidArgumentException',原因:'您无法启动已经处于活动状态的查询'”

    如果每次在观察者更新处理程序中创建一个新的样本查询,然后执行,它就可以正常工作。

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

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

1 个答案:

答案 0 :(得分:2)

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