gpt4 book ai didi

ios - 处理 EKEventStoreChangedNotification 通知

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:41:51 27 4
gpt4 key购买 nike

我在我的应用程序中列出了事件。用户可以创建、编辑和删除事件。在 viewDidLoad 方法中,我获取我需要的所有事件并将它们推送到一个数组中。它按预期工作。

为了创建、编辑和删除事件,我使用了 EKEventEditViewControllerEKEventViewController,效果很好。在 Controller 的委托(delegate)方法中,我对我的数组进行了所需的更改并重新加载了我的 View 。

当然,如果用户从另一个应用程序(如内置日历应用程序)进行了一些更改,我当然也想知道并处理。所以我观察到 EKEventStoreChangedNotification。从该通知中,我只得到“发生了变化”,而不是哪个事件或来自哪个应用程序。实际上我想知道的是,如果更改是从我的应用程序或其他应用程序发生的,以及哪些事件已更改。因为我已经在 EKEventEditViewControllerDelegate 方法中处理了(来 self 的应用程序的)更改,所以我不需要再次处理它们。

如果我不知道哪些对象已更改,我必须对所有对象进行获取和排序。

目前我在日历(开发设备)中只有 5 个事件,当然获取和排序所有事件不是问题,但如果用户有超过 1000 个事件,可能只改变一个事件就有点过分了。

所以我的问题是:如何处理EKEventStoreChangedNotification

最佳答案

您可以通过以下代码准确检测到哪个事件已更改[免责声明代码不是我的想法,我在另一个 Stack Overflow 答案中找到它并稍微修改了它]。

我正在使用一个名为“JSCalendarManager”的库与 eventstore 进行交互,在我的例子中,作为使用我的应用程序创建并与 iCalendar 同步的事件,我已经将它们的 eventIdentifier 保存在本地数据库中,我可以检索我的时间绑定(bind)以搜索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;
}
}];
}];
}];}

关于ios - 处理 EKEventStoreChangedNotification 通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17806209/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com