Ios 维护对日历的同步验证引用

Ios 维护对日历的同步验证引用,ios,calendar,Ios,Calendar,对于我的应用程序,我必须在用户的iCloud帐户中创建一个日历,并将事件添加到该日历中 我正在使用以下方法创建日历: let newCalendar = EKCalendar(forEntityType: EKEntityTypeEvent, eventStore: EventManager.sharedInstance.eventStore) newCalendar.title = "MyAppCalendar" let color = UIColor(red: CGFloat

对于我的应用程序,我必须在用户的iCloud帐户中创建一个日历,并将事件添加到该日历中

我正在使用以下方法创建日历:

let newCalendar = EKCalendar(forEntityType: EKEntityTypeEvent, eventStore: EventManager.sharedInstance.eventStore)
    newCalendar.title = "MyAppCalendar"
    let color = UIColor(red: CGFloat(arc4random_uniform(255))/255, green: CGFloat(arc4random_uniform(255))/255, blue: CGFloat(arc4random_uniform(255))/255, alpha: 1)
    newCalendar.CGColor = color.CGColor

    var mySource:EKSource?
    for source in EventManager.sharedInstance.eventStore?.sources() as! [EKSource] {
        if source.sourceType.value == EKSourceTypeCalDAV.value && source.title == "iCloud" {
            mySource = source
            break
        }
    }
    if mySource == nil {
        //crearting alert and displaying to user
        return
    }
    else {
        newCalendar.source = mySource!
    }

    var error:NSError?
    if EventManager.sharedInstance.eventStore!.saveCalendar(newCalendar, commit: true, error: &error) {
        let calendarName = newCalendar.title
        let calendarIdentifier = newCalendar.calendarIdentifier
        //save these in db and server
    }else {
        SharedConstants.handleErrors(error!)
    }
其中,
EventManager
是维护对
EKEventStore
对象实例引用的类

但在苹果的文档中,它说日历标识符在同步时会发生变化


因此,我的问题是如何维护对该日历的引用?

没有解决方案能够在100%的情况下工作,因为正如您所知,
日历标识符可以更改。因此,没有任何唯一标识符将始终引用特定日历。
但在大多数情况下,解决方案是可行的。我建议使用这种算法来引用特定的日历:
我假定您已经为日历缓存了
日历标识符
标题

  • 遍历所有日历
  • 检查是否有任何日历的标识符与缓存的标识符相同
  • 如果标识符相等,则找到日历
  • 在另一种情况下,检查是否有任何日历的标题等于缓存的标识符
  • 如果标题相等,那么您可能会找到您的日历。如果用户为您的日历和其他日历替换了标题,则可能不正确。我认为这种情况发生的可能性很小
  • 在其他情况下,您将无法找到您的日历。当用户删除您的日历时,可能会发生这种情况 以下是上述算法的代码片段:

    func eventsCalendarWithIdentifier(identifier: String!, title: String!) -> EKCalendar? {
        var calendarWithIdentifier: EKCalendar? = nil
        var calendarWithTitle: EKCalendar? = nil
    
        let eventStore = EventManager.sharedInstance.eventStore!
        for aCalendar in eventStore.calendarsForEntityType(EKEntityTypeEvent) as! [EKCalendar] {
            if var anIdentifier = aCalendar.calendarIdentifier {
                if anIdentifier == identifier {
                    calendarWithIdentifier = aCalendar
                    break
                }
            }
    
            if var aTitle = aCalendar.title {
                if aTitle == title {
                    calendarWithTitle = aCalendar
                }
            }
    
        }
    
        return calendarWithIdentifier ?? calendarWithTitle
    }
    
    另外,在发生潜在的完全同步时处理事件并重新创建日历实例也很重要。这一点很重要,因为用户可以在应用程序处于后台时删除您的日历,在这种情况下,日历将无效。
    以下是处理此类事件的代码片段:

    func registerObserver() {
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: "storeChanged",
            name: EKEventStoreChangedNotification,
            object: nil)
    }
    
    func unregisterObserver() {
        NSNotificationCenter.defaultCenter().removeObserver(self,
            name: EKEventStoreChangedNotification,
            object: nil)
    }
    
    func storeChanged() {
        let myCalendar = self.eventsCalendarWithIdentifier(cachedIdentifier, title: cachedTitle)
        if myCalendar == nil {
            // Calendar lost.
        }
        // Updated UI if needed.
    }
    

    看看这个答案:。也许这会有帮助。@Visput谢谢你的链接,但是我如何克服我的问题呢?谢谢你花时间回答我。但我正在寻找一种简单易行的方法,从ios calendar db获取我的日历。实际上,我已经厌倦了您的方法,添加了日历的
    CGColor
    的第三个约束,但它仍然不是万无一失的。如果可能的话,我会等待任何改进。