2011-10-14 41 views
6

Khi tôi cố gắng nhận mã định danh của EKEvent, tất cả những gì tôi nhận được là giá trị nil. Vì trong ECMvent của iOS5 là một phân lớp của EKCalendarItem, tôi đã nhận ra rằng tôi có thể nhận được UUID của EKCalendarItem, nhưng nó cũng trả về nil.EKEvent eventIdentifier trả về null

Tất cả bây giờ và sau đó tôi cũng nhận được lỗi này trong khi cố gắng truy cập vào định hoặc tài sản 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)" 

Tôi đã bị mắc kẹt trên vấn đề này trong một thời gian khá bây giờ, nhưng hình dung nó sẽ là iOS5 beta liên quan. Nhưng kể từ khi chúng tôi đang ở iOS5, nó vẫn không hoạt động.

Trả lời

7

Khi tôi cố gắng để có được những nhận dạng của một EKEvent, tất cả tôi nhận được là một giá trị nil

Cố gắng tiết kiệm và cam kết sự kiện của bạn trước khi lấy các định danh:

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

Trong ứng dụng của tôi, tôi phát hiện ra rằng nếu bạn yêu cầu eventIdentifier khi eventStore tìm nạp nó đã được phát hành, nó trả về nil. Nhưng nếu bạn yêu cầu eventIdentifier trước khi nó sẽ trả về id ok. Sau đó bạn có thể giải phóng thể hiện EKEventStore và yêu cầu mã định danh mà không có vấn đề gì .... Có vẻ như nó cần eventStore để lấy id, nhưng tôi không nhận được cảnh báo.

+0

Tôi nhận được cảnh báo này và tôi thấy rằng tôi đã phát hành EKEventStore của mình quá sớm. Bây giờ, tôi giữ nó cho đến khi tôi được thực hiện với EKEvents của tôi, và tất cả mọi thứ là tốt. Tôi nhận được dữ liệu của mình và tôi không có cảnh báo. –

+1

Đây phải là một phần của Tài liệu Apple. – Dare2Dream

+0

Điều này thực sự có vấn đề khi kết hợp với ARC.Cảm ơn bạn đã đào bới, điều đó sẽ khiến tôi mất thời gian để tìm kiếm. –

2

eventIdentifier được đặt khi sự kiện được thêm vào EKEventStore. Nếu bạn cố gắng truy cập vào giá trị này trước khi thêm nó, nó sẽ trả về null.

+1

làm thế nào tôi có thể biết rằng quá trình async này tức là thêm sự kiện vào lịch đã kết thúc hoặc quá trình cam kết để kết thúc DB? bởi vì tôi vẫn nhận được nil ngay cả sau khi cố gắng truy cập nó sau khi saveEvent Sentence –

2

Chỉ cần trải qua vấn đề này, cử tri đi bầu các eventIdentifier sẽ được null trước khi cam kết cơ sở dữ liệu, vì vậy bạn cần một cam kết: YES trong hàm saveEvent [self.eventStore saveEvent:event span:EKSpanThisEvent commit:YES error:&error];

Sau đó, bạn có thể nhận được eventIdentifier.

Lỗi của tôi đã chuyển thông số NO đến commit:.

+0

làm thế nào tôi có thể biết rằng quá trình async này, tức là thêm sự kiện vào lịch đã kết thúc hoặc quá trình cam kết để kết thúc DB? bởi vì tôi vẫn nhận được nil ngay cả sau khi cố gắng truy cập nó sau khi saveEvent Sentence –

+0

Tôi thông qua nó sẽ là một cuộc gọi đồng bộ nếu thêm commit: YES parameter, bạn có sử dụng hai luồng để truy cập eventIdentifier và lưu nó không? –

+0

yep tôi đã làm điều đó và nó hoạt động nhờ –

0

Đối với tôi, số eventIdentifier là không vì tôi không đặt endDate. Vì vậy, nói chung, eventIdentifier có thể là null nếu có bất kỳ lỗi nào khi tạo sự kiện đó. Bạn có thể kiểm tra các lỗi như sau:

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

Sự kiện EKEventIdendifier không được tạo cho đến khi sự kiện được lưu. Bạn có thể truy cập vào/cửa hàng eventIdentifier sau khi bạn đã lưu sự kiện để các EKEventStore

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

Đối Swift 3

Tôi đã phát hiện ra, rằng vấn đề là tôi đã tạo ra các cửa hàng trong phạm vi chức năng lấy ngày tháng.

Tạo cửa hàng bên ngoài chức năng và sử dụng thể hiện của nó đã giải quyết được sự cố.

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) 

      } 

     } 

    } 

}