Reminders.app双向同步逻辑

时间:2013-05-12 14:19:11

标签: iphone cocoa-touch cocoa eventkit ekeventkit

我希望我的应用与Reminders.app同步。 (我的应用程序使用核心数据)

我已经完成了一个原型并且它可以工作,但是有一些我无法想到的错误。

现在我的同步算法如下所示:

1.听取EKEventStoreChangedNotification通知和同步时

2.首先,我在我的本地日历上进行迭代,如果它们在Reminders.app中不存在,我会添加它们。

这是一个非常糟糕的设计,因为如果我在Reminders.app中删除日历并且如果它已添加到我的应用程序中,它将再次添加到Reminders.app。知道日历是否已被删除会更好。

3.然后我从Reminders.app迭代每个日历,如果我的本地记录中不存在此日历,我将它们添加到我的local.app。如果确实存在,那么我正在更新其标题。

4.我正在从EKEventStore

获取所有提醒

5.我正在遍历所有本地提醒,如果它们不存在于Reminders.app中,我正在添加它们。

删除的问题 - 与删除日历相同的故事。

6.我正在遍历所有Reminders.app提醒,如果它们在我的应用程序中不存在,我将它们添加到我的local.app中。如果它们存在,我正在更新所有值。

一切都很好,直到我通过删除来解决这个问题。我看到EKObject有一些方法可以帮助我,但我无法弄明白。我该如何正确地做到这一点,我可以做些什么来优化?

2 个答案:

答案 0 :(得分:0)

如何跟踪您在.plist中安排的提醒? 因此,如果您的算法正在检查.plist中缺少的内容,并且如果它显示为已经添加到.plist中但不在日历中,则表示它已被删除。

  //Create dictionary that keeps track of your reminders

NSMutableDictionary *dictionary = [self remindersDictionary];

[dictionary setValue:local.fireDate forKey:title];
[dictionary setValue:@"TRUE" forKey:addedToReminders];

[plistDictionary setValue:dictionary forKey:@"reminders"];
[plistDictionary writeToFile:plistPath atomically:YES];

+(NSMutableDictionary *)remindersDictionary
{
NSString *searchPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];

plistPath = [searchPath stringByAppendingPathComponent:@"settings.plist"];
plistDictionary = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
NSMutableDictionary *dictionary = [plistDictionary valueForKey:@"reminders"];

return dictionary;

}

答案 1 :(得分:0)

你有date changed - 属性或类似的东西吗?这会让事情变得更容易。

理想情况下,您可以保存在某处删除cal的信息。然后 - 同步 - 您可以检查日历(您即将添加)是否最近被删除。如果是这种情况,您可以删除本地日历并删除要删除的信息。因此,列表保持清洁,除非您删除项目并且它已成功同步到对应项。

或者如果您想按日期进行,可以比较lastSyncedDatecalendarModifiedDate(仅举两个例子)。但这不是一个很好的解决方案。你必须考虑时区,时间变化和用户与时间的互动,例如。设置已更改。