2012-08-30 32 views
8

Tôi đang sử dụng EKEventStore trong ứng dụng của mình. Tôi lấy cửa hàng mặc định và đăng ký EKEventStoreChangedNotification để được thông báo khi có thay đổi đối với lịch. Tuy nhiên, khi thay đổi được thực hiện, người gửi cho thông báo được gọi một vài lần (5-10) lần, đôi khi với tối đa 15 giây ở giữa mỗi cuộc gọi. Điều này làm rối tung mã của tôi và khiến mọi việc trở nên khó khăn hơn nhiều. Tôi có thể làm được gì không?EKEventStoreChangedNotification được gọi nhiều lần

Cảm ơn

iOS7 EDIT: Nó có vẻ như là của việc phát hành iOS7, vấn đề này đã biến mất. Bây giờ, bất kể thay đổi được thực hiện cho CalendarStore, chỉ có một EKEventStoreChangedNotification được gửi.

Trả lời

16

Đây là kết quả của chính xác cách thông báo được gửi đi và nội dung thông báo thực sự được thông báo. Theo kinh nghiệm của tôi, bạn có thể mong đợi nhận được ít nhất một thông báo về thay đổi đối với một mục (sự kiện, lời nhắc, v.v.) và ít nhất một thông báo cho thay đổi kết quả cho lịch có chứa cho mục đó.

Nếu không nhìn thấy mã của bạn và biết những thay đổi đang được thực hiện, tôi không thể quá cụ thể về câu trả lời; tuy nhiên, nói chung, bạn có hai lựa chọn.

  1. Quan sát các thay đổi chặt chẽ hơn - có thể bạn bỏ qua một số thông báo nếu chúng liên quan đến các sự kiện không liên quan đến ứng dụng của bạn hoặc nếu bạn đã xử lý thay đổi cho một mục cụ thể.
  2. Hợp nhất nhiều thay đổi thành một chuỗi xử lý đơn lẻ. Về cơ bản, khi bạn nhận được thông báo, thay vì khởi động phản hồi của bạn ngay lập tức, hãy bắt đầu hẹn giờ sẽ chạy phản hồi sau một hoặc hai giây. Sau đó, nếu một thông báo khác xuất hiện trước khi bộ hẹn giờ kích hoạt, bạn có thể hủy bộ hẹn giờ và đặt lại. Bằng cách này, bạn có thể nhóm nhiều thông báo đến trong một cửa sổ thời gian ngắn và chỉ phản hồi lại chúng một lần (khi bộ đếm thời gian kết thúc).

Giải pháp thứ hai là câu trả lời ưa thích của tôi, và có thể giống như thế (tạm thời bỏ qua những lo ngại luồng):

@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

Chỉ cần một cách nhanh chóng cảm ơn bạn, và thông tin phản hồi: với iOS 8.4.1 hành vi mà bạn nhận thấy (ít nhất 2 thông báo được kích hoạt cho mọi thay đổi) vẫn rất đúng và n của bạn. 2 giải pháp làm việc tuyệt vời cho tôi; Tôi không chắc chắn giải pháp n. 1 có thể được áp dụng cho EKEventStoreChangedNotification, mặc dù, vì những thông báo này không mô tả những thay đổi xảy ra với EKEventStore. Vì vậy, giải pháp n. 2 là con đường để đi! – cdf1982

+0

Tôi gặp sự cố tương tự trên iOS9 –

Các vấn đề liên quan