ios - 处理 EKEventStoreChangedNotification 通知
<p><p>我在我的应用程序中列出事件。用户可以创建、编辑和删除事件。在 <code>viewDidLoad</code> 方法中,我获取我需要的所有事件并将它们推送到一个数组中。它按预期工作。 </p>
<p>对于创建、编辑和删除事件,我使用 <code>EKEventEditViewController</code> 和 <code>EKEventViewController</code> 效果很好。在 Controller 的委托(delegate)方法中,我对数组进行所需的更改并重新加载我的 View 。</p>
<p>当然,如果用户从另一个应用程序(如内置日历应用程序)进行一些更改,我也想知道并处理。所以我观察<code>EKEventStoreChangedNotification</code>。从该通知中,我只得到“发生了变化”,而不是哪个事件或来自哪个应用程序。实际上我想知道的是,我的应用程序或其他应用程序是否发生了更改,以及哪些事件已更改。由于我已经在 EKEventEditViewControllerDelegate 方法中处理了更改(来 self 的应用程序),因此我不需要再次处理它们。 </p>
<p>如果我不知道哪些对象已更改,我必须获取并排序所有对象。 </p>
<p>目前我在日历(开发设备)中只有 5 个事件,当然获取和排序所有事件不是问题,但如果用户有超过 1000 个,那么可能只有一个事件更改就过分了。 </p>
<p>所以我的问题是:如何处理 <code>EKEventStoreChangedNotification</code>?</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>您可以通过以下代码准确检测出哪个事件已被更改[免责声明代码不是我的想法,我在另一个 Stack Overflow 答案中找到并稍作修改]。</p>
<p>我正在使用一个名为“JSCalendarManager”的库与 eventstore 交互,在我的情况下,作为使用我的应用程序创建并与 iCalendar 同步的事件,我已经将它们的 eventIdentifier 保存在本地 DB 中,我可以检索我的时间绑定(bind)来搜索iCalendar 中的事件并匹配更改的事件。</p>
<pre><code>+(void)iCloudStoreChanged:(NSNotification*)eventStoreChangeNotification{
NSArray* allScheduleRecords =;
NSDate* startDate = ;
NSDate* endDate = ;
NSDateFormatter *dateFormatter = [ init];
;
if (allScheduleRecords.count >= 2) {
startDate = objectForKey:@"meetingTime"]];
endDate = objectForKey:@"meetingTime"]];
}else if (allScheduleRecords.count > 0){
startDate = objectForKey:@"meetingTime"]];
NSDate *today = ;
NSCalendar *gregorian = [ initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = ;
components.day = 1;
endDate = ;
}else{
}
NSArray *ekEventStoreChangedObjectIDArray = ;
[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 () {
// Log the event we found and stop (each event should only exist once in store)
NSLog(@"calendarChanged(): Event Changed: title:%@", ekEvent.title);
;
*stop = YES;
}
}];
}];
}];}
</code></pre></p>
<p style="font-size: 20px;">关于ios - 处理 EKEventStoreChangedNotification 通知,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/17806209/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/17806209/
</a>
</p>
页:
[1]