【问题标题】:Reminders.app two-way synchronisation logicReminders.app 双向同步逻辑
【发布时间】:2013-05-12 14:19:10
【问题描述】:

我希望我的应用与 Reminders.app 同步。 (我的应用使用 Core Data)

我已经做了一个原型,它可以工作,但是有一些我想不通的错误。

现在我的同步算法是这样的:

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 有一些方法可以帮助我,但我想不通。我该如何正确地做到这一点,我可以做些什么来优化?

【问题讨论】:

    标签: iphone cocoa-touch cocoa eventkit ekeventkit


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,但这正是我的问题 - 如何保存日历被删除的信息?我说的是当它从 Reminders.app 中删除时,当日历从我的应用程序中删除时,我将它从我的持久存储和 Reminders.app 中删除,没关系。
    • 您还可以有第三个日历,它代表Reminders.app 的最后一个已知状态。然后,您就可以从 Reminders 应用程序到您的临时 cal。意味着如果Reminders.app 缺少日历,您将在临时日历中删除它,瞧,您有该日历的删除信息。而且您有从本地 cal 到临时 cal 的单向方法。合并差异并记录删除信息
    • 我一直在考虑这个问题,这似乎有点矫枉过正,但这是一个明智的建议。不过,我仍然愿意征求意见。
    【解决方案2】:

    如何跟踪您在 .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;
    
    }
    

    【讨论】:

    • 不,我已经在使用 Core 数据,我不需要其他存储空间。
    • 向您的提醒数据模型添加一个属性怎么样?如果它被添加了会跟踪什么?
    猜你喜欢
    • 2015-08-05
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2022-12-06
    • 2021-07-13
    相关资源
    最近更新 更多