2

アプリにイベントをリストしています。ユーザーはイベントを作成、編集、および削除できます。メソッドではviewDidLoad、必要なすべてのイベントをフェッチし、それらを配列にプッシュします。期待どおりに動作します。

私が使用するイベントの作成、編集、および削除にはEKEventEditViewControllerEKEventViewControllerかなりうまく機能します。コントローラーのデリゲート メソッドで、アレイに必要な変更を加え、ビューをリロードします。

もちろん、ユーザーが別のアプリ(組み込みのカレンダーアプリなど)から変更を加えた場合も、知り、処理したいと思います。だから私は観察しEKEventStoreChangedNotificationます。その通知から、どのイベントまたはどのアプリからではなく、「変更が発生しました」のみが表示されます。実際に知りたいのは、変更が自分のアプリまたは別のアプリから発生したかどうか、およびどのイベントが変更されたかです。EKEventEditViewControllerDelegate メソッドで (アプリからの) 変更を既に処理しているため、再度処理する必要はありません。

どのオブジェクトが変更されたかわからない場合は、それらすべてをフェッチしてソートする必要があります。

今のところ、カレンダー (開発デバイス) には 5 つのイベントしかありません。もちろん、すべてのイベントを取得して並べ替えるのは問題ではありませんが、ユーザーが 1000 を超えるイベントを持っている場合、おそらく 1 つのイベントの変更だけではやり過ぎです。

私の質問は次のとおりEKEventStoreChangedNotificationです。

4

2 に答える 2

1

次のコードでどのイベントが変更されたかを正確に検出できます [免責コードは私の考えではありません。別のスタック オーバーフローの回答で見つけて、少し変更しました]。

私はイベントストアとのやり取りに「JSCalendarManager」と呼ばれるライブラリを使用しています。私の場合、アプリを使用して作成され、iCalendar と同期されたイベントとして、既にローカル DB に eventIdentifier を保存しています。iCalendar でイベントを検索するためにバインドされた時間を取得できます。変更されたものと一致します。

+(void)iCloudStoreChanged:(NSNotification*)eventStoreChangeNotification{
NSArray* allScheduleRecords =[self getAllScheduleRecordSyncedToICalendar];

NSDate* startDate = [NSDate new];
NSDate* endDate   = [NSDate new];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

if (allScheduleRecords.count >= 2) {
    startDate = [dateFormatter dateFromString:[[allScheduleRecords firstObject] objectForKey:@"meetingTime"]];
    endDate = [dateFormatter dateFromString:[[allScheduleRecords lastObject] objectForKey:@"meetingTime"]];
}else if (allScheduleRecords.count > 0){
    startDate = [dateFormatter dateFromString:[[allScheduleRecords firstObject] objectForKey:@"meetingTime"]];

    NSDate *today = [NSDate date];
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *components = [gregorian components:(NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:today];
    components.day = 1;
    endDate = [gregorian dateFromComponents:components];
}else{
}

NSArray *ekEventStoreChangedObjectIDArray = [eventStoreChangeNotification.userInfo objectForKey:@"EKEventStoreChangedObjectIDsUserInfoKey"];

[calendarManager findEventsBetween:startDate
                               and:endDate
                 withSearchHandler:^(BOOL found, NSError *error, NSArray *eventsArray) {
                     [eventsArray enumerateObjectsUsingBlock:^(EKEvent *ekEvent, NSUInteger idx, BOOL *stop) {
                         // Check this event against each ekObjectID in notification
                         [ekEventStoreChangedObjectIDArray enumerateObjectsUsingBlock:^(NSString *ekEventStoreChangedObjectID, NSUInteger idx, BOOL *stop) {
                             NSObject *ekObjectID = [(NSManagedObject *)ekEvent objectID];
                             if ([ekEventStoreChangedObjectID isEqual:ekObjectID]) {
                                 // Log the event we found and stop (each event should only exist once in store)
                                 NSLog(@"calendarChanged(): Event Changed: title:%@", ekEvent.title);
                                 [self updateAppointmentForEvent:ekEvent];
                                 *stop = YES;
                             }
                         }];
                     }];
                 }];}
于 2015-11-17T18:05:53.943 に答える
0

すべてのイベントを取得する代わりに、画面上/アクティブなイベントのみを更新できませんか。

于 2013-08-25T17:02:03.870 に答える