2012-08-30 3 views
8

내 앱에서 EKEventStore를 사용하고 있습니다. 기본 저장소를 잡고 달력에 변경 사항이있을 때 EKEventStoreChangedNotification에 알리도록 등록하십시오. 그러나 변경이 이루어지면 알림을 보낸 사람이 여러 번 (5 ~ 10 회) 호출되며 때로는 각 호출 사이에 최대 15 초가 걸립니다. 이렇게하면 코드가 엉망이되어 작업하기가 훨씬 어려워집니다. 이것에 대해 제가 할 수있는 일이 있습니까?EKEventStoreChangedNotification이 여러 번 호출됩니다.

감사

iOS7에의 편집 ​​: iOS7에의 출시로,이 문제가 사라진 것처럼 보인다. 이제는 CalendarStore에 대한 변경 사항과 관계없이 하나만 EKEventStoreChangedNotification이 전송됩니다.

답변

16

이것은 알림이 전달되는 방식과 실제로 알림이 전달되는 방식의 결과입니다. 내 경험에 따르면, 항목 (이벤트, 알림 등)에 대한 변경 사항 알림과 해당 항목에 대한 포함 캘린더의 결과 변경 사항에 대한 알림을 적어도 하나 이상받을 수 있습니다.

코드를 보지 않고 변경 내용을 알지 못해도 대답에 대해 너무 구체적 일 수는 없습니다. 그러나 일반적으로 두 가지 옵션이 있습니다.

  1. 변경 사항을 자세히 살펴보세요. 앱 관련 이벤트가 아닌 경우 또는 특정 항목에 대한 변경 사항을 이미 처리 한 경우 일부 알림을 무시해도됩니다.
  2. 여러 변경을 단일 처리기 코드 배치로 병합합니다. 기본적으로 알림을 받으면 즉시 응답을 시작하는 대신 2 ~ 2 초 안에 응답을 실행할 타이머를 시작하십시오. 그런 다음 타이머가 시작되기 전에 다른 알림이 수신되면 타이머를 취소하고 재설정 할 수 있습니다. 이렇게하면 짧은 시간에 들어오는 여러 알림을 일괄 처리하고 한 번만 응답 할 수 있습니다 (타이머가 결국 실행될 때).

후자의 솔루션은 나의 선호하는 대답이며, (일시적 스레딩 문제를 무시)과 같이 보일 수 있습니다

@property (strong) NSTimer *handlerTimer; 

- (void)handleNotification:(NSNotification *)note { 
    // This is the function that gets called on EKEventStoreChangedNotifications 
    [self.handlerTimer invalidate]; 
    self.handlerTimer = [NSTimer timerWithTimeInterval:2.0 
               target:self 
               selector:@selector(respond) 
               userInfo:nil 
               repeats:NO]; 
    [[NSRunLoop mainRunLoop] addTimer:self.handlerTimer 
           forMode:NSDefaultRunLoopMode]; 
} 

- (void)respond { 
    [self.handlerTimer invalidate]; 
    NSLog(@"Here's where you actually respond to the event changes"); 
} 
+1

그냥 빨리 감사 및 피드백 : 아이폰 OS가 동작을 8.4.1로 알림 (모든 변경 사항에 대해 최소 2 건의 알림이 표시됨)은 여전히 ​​매우 사실입니다. 2 해결책은 저를 위해 경이롭게 작동했습니다; 솔루션 n 확실하지 않습니다. 1은 EKEventStoreChangedNotification에 적용될 수 있습니다. 이러한 알림은 EKEventStore에 어떤 변경이 발생했는지 설명하지 않기 때문입니다. 그래서, 솔루션 n. 2가는 길입니다! – cdf1982

+0

iOS9에서 같은 문제가 있습니다. –

관련 문제