4

문제점을 해결하기 위해 노력하고 있습니다. HKObserveryQuery을 설치했으며, 저의 새로운 데이터를 수집합니다.HKObserverQuery가 무작위로 두 번 연속 호출되었습니다.

그러나 문제는 Health 응용 프로그램에 수동으로 추가 한 후 Health 응용 프로그램으로 돌아가서 항목을 삭제할 때 가끔 두 시간을 매우 가깝게 설정했음을 알리는 HKObserverQuery입니다. 이 관찰자를 사용하여 나중에 일부 데이터를 업로드하고 복제본을 원하지 않기 때문에 해결하려고합니다.

제공되는 도움에 감사드립니다. 코드 :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [self setup]; 

    return YES; 
} 

- (void)setup 
{ 
    if ([HKHealthStore isHealthDataAvailable]) 
    { 
     self.healthStore = [[HKHealthStore alloc]init]; 

     NSSet *readTypes = [NSSet setWithObject:[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]]; 

     [self.healthStore requestAuthorizationToShareTypes:nil 
               readTypes:readTypes 
               completion:^(BOOL success, NSError *error) 
     { 
      if (!error && success) 
      { 
       [self observeHR]; 

       [self.healthStore enableBackgroundDeliveryForType: 
       [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate] 
       frequency:HKUpdateFrequencyImmediate withCompletion:^(BOOL success, NSError *error){}]; 
      } 
     }]; 
    } 
} 

- (void)observeHR 
{ 
    HKObserverQuery *query = [[HKObserverQuery alloc]initWithSampleType:[HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate] 
         predicate:nil 
    updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error) 
    { 
     if (!error) 
     { 
      // Randomly called twice *VERY* close together 
      NSLog(@"Query"); 
      [self queryWithCompletionHandler:completionHandler]; 
     } 
     else 
     { 
      if (completionHandler) 
      { 
       completionHandler(); 
      } 
     } 
    }]; 

    [self.healthStore executeQuery:query]; 
} 

콘솔 출력, 시간 확인 : 이것은 건강 앱에서 하나의 항목 만 삭제할 때 발생합니다. 잘못된 것입니다.

2014-12-29 16:50:20.121 TestApp[174:5674] Query 
2014-12-29 16:50:20.124 TestApp[174:5674] Query 

답변

2

나는 지금 두 번째 가짜 HKObserverQuery가 호출 될 방지하기 위해 BOOL 플래그를 설정하고, 아무 이유없이 중복 처리를 제거하여 문제를 해결했습니다 생각합니다. 코드 :

- (void)observeHR 
{ 
    HKObserverQuery *query = [[HKObserverQuery alloc]initWithSampleType:[HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate] 
         predicate:nil 
    updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error) 
    { 
     if (!self.queryInProgress) 
     { 
      self.queryInProgress = YES; 

      if (!error) 
      { 
       [self queryWithCompletionHandler:completionHandler]; 
      } 
      else 
      { 
       self.queryInProgress = NO; 

       if (completionHandler) 
       { 
        completionHandler(); 
       } 
      } 
     } 
     else 
     { 
      NSLog(@"Query already in progress"); 
     } 
    }]; 

    [self.healthStore executeQuery:query]; 
} 
+1

왜 이것이 필요한지 궁금합니다. 동일한 문제가 발생하고 스토리지 및 처리 시스템에 과도한 부하가 발생하지 않도록하고 싶습니다. 이중 발사의 원인을 찾았습니까? – myusuf3

+1

이 두 가지 쿼리 실행 문제에 대한 해결책이 무엇입니까? 나는 나의 경우에 동일한 문제에 직면하고있다. 가능한 빨리 공유하십시오. – Aks

4

당신은 HKObserverQueryupdateHandler는 특정 이벤트에 대해 정확히 한 번 발사에 의존하는 시스템을 설계해서는 안된다. 술어와 일치하는 샘플 수가 추가 또는 삭제되었을 수 있다는 표시로 간단하게 updateHandler의 호출을 처리하십시오. 쿼리를 수행하여 변경된 사항을 발견하는 것은 전적으로 귀하에게 달려 있습니다. 예를 들어, 술어와 일치하는 새 샘플에만 관심이있는 경우 HKAnchoredObjectQuery을 사용하여 아직 처리하지 않은 샘플 만 검색 할 수 있습니다.

+1

물론 이에 동의합니다. 하지만 이것이 왜 두 번 해고되는지 궁금합니다. – myusuf3