【问题标题】:EKEvent eventIdentifier returns nullEKEvent 事件标识符返回 null
【发布时间】:2011-10-14 14:00:04
【问题描述】:

当我尝试获取 EKEvent 的标识符时,我得到的只是一个 nil 值。由于在 iOS5 中 EKEvent 是 EKCalendarItem 的子类,我想我可能能够获得 EKCalendarItem 的 UUID,但它也返回 nil。

在尝试访问标识符或 UUID 属性时,有时我也会收到此错误:

CADObjectGetInlineStringProperty failed fetching uniqueID for EKPersistentEvent with error Error Domain=NSMachErrorDomain Code=268435459 "The operation couldn’t be completed. (Mach error 268435459 - (ipc/send) invalid destination port)"

我已经被这个问题困扰了很长一段时间了,但我认为这与 iOS5 beta 相关。但由于我们现在是 iOS5,它仍然无法正常工作。

【问题讨论】:

    标签: iphone objective-c ios5 eventkit ekevent


    【解决方案1】:

    在我的应用程序中,我发现如果您在获取它的 eventStore 已释放时请求 eventIdentifier,它会返回 nil。但是,如果您在它返回 id 之前询问 eventIdentifier 就可以了。然后,您可以释放 EKEventStore 实例并毫无问题地请求标识符.... 似乎它需要 eventStore 来检索 id,但我没有收到任何警告。

    【讨论】:

    • 我收到了这个警告,我发现我发布我的 EKEventStore 太早了。现在,我一直持有它,直到完成我的 EKEvents,一切都很好。我得到了我的数据,我没有任何警告。
    • 这应该是 Apple 文档的一部分。
    • 这与 ARC 结合起来确实有问题。感谢您的挖掘,这将花费我大量的时间才能找到。
    【解决方案2】:

    当我尝试获取 EKEvent 的标识符时,我得到的只是一个 nil 值

    在检索标识符之前尝试保存并提交您的事件:

    [eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
    NSString *strId = [[NSString alloc] initWithFormat:@"%@", event.eventIdentifier];
    

    【讨论】:

      【解决方案3】:

      eventIdentifier 在事件添加到 EKEventStore 时设置。如果您在添加之前尝试访问此值,它将返回 null。

      【讨论】:

      • 我怎么知道这个异步过程,即添加事件到日历完成或提交过程到数据库完成?因为即使在 saveEvent Sentence 之后尝试访问它,我仍然得到 nil
      【解决方案4】:

      刚刚经历了这个问题,在提交到数据库之前,eventIdentifier 将为空, 所以你需要一个 commit:YES 在 saveEvent 函数[self.eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error];

      之后,您可以获取 eventIdentifier。

      我的错是通过一个 NO 来提交:参数。

      【讨论】:

      • 我怎么知道这个异步过程,即添加事件到日历完成或提交过程到数据库完成?因为即使在 saveEvent Sentence 之后尝试访问它,我仍然得到 nil
      • 如果添加commit:YES参数,我通过它将是一个同步调用,你是否使用两个线程访问事件标识符并保存它?
      【解决方案5】:

      对我来说,eventIdentifier 为空,因为我没有设置 endDate。所以通常eventIdentifier 可以为空,如果在创建该事件时出现任何错误。您可以检查以下错误:

      NSError *err = nil;
      [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err];
      NSLog(@"Error : %@",err);
      

      【讨论】:

        【解决方案6】:

        在保存事件之前不会生成 EKEvent 事件标识符。将事件保存到 EKEventStore 后,您可以访问/存储 eventIdentifier

            [store saveEvent:event span:EKSpanThisEvent error:&err];
            NSString *eventIdentifier = event.eventIdentifier;
        

        【讨论】:

          【解决方案7】:

          对于 Swift 3

          我发现问题在于我在检索日期的函数中创建了商店。

          在函数之外创建存储并使用它的实例解决了这个问题。

          class CalendarServices: NSObject {
          
              var store = EKEventStore()
          
              func fetchEventKitCalendarEvents(date: Date, completion: @escaping (_ events: [EKEvent]?, _ error: Error?)->()) {
          
                  let calendar = Calendar.current
          
                  guard self.getEventKitAuthorizationStatus() == .authorized else {
                      completion(nil, CoreServices.setError(message: "AuthorizationStatus != authorized"))
                      return
                  }
          
                  guard let endDate = calendar.date(byAdding: .day, value: 1, to: date)  else {
                      completion(nil, CoreServices.setError(message: "Error creating endDate"))
                      return
                  }
          
                  CoreServices.background {
          
                      let predicate = self.store.predicateForEvents(withStart: date, end: endDate, calendars: self.fetchEventKitCalendars())
          
                      let events = self.store.events(matching: predicate).sorted() {
                          (e1: EKEvent, e2: EKEvent) -> Bool in
                          return e1.startDate.compare(e2.startDate) == .orderedAscending
                      }
          
                      CoreServices.async {
          
                          completion(events, nil)
          
                      }
          
                  }
          
              }
          
          }
          

          【讨论】:

            猜你喜欢
            • 2019-01-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-15
            • 1970-01-01
            相关资源
            最近更新 更多