2013-10-14 22 views
10

Tôi chỉ muốn thêm sự kiện vào lịch của thiết bị.Thêm sự kiện vào lịch rất chậm

Tôi đang sử dụng:

__weak ProgramViewController *weakSelf = self; 

EKEventStore *store = [[EKEventStore alloc] init]; 

    [store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) 
    { 
     if (error) 
       NSLog(@"EKEventStore error = %@", error); 

     if (granted) 
     { 
      NSLog(@"EKEvent *event "); 

      EKEvent *event = [EKEvent eventWithEventStore:store]; 
      event.title = weakSelf.program.title; 
      event.location = weakSelf.program.locationPublic; 
      event.startDate = weakSelf.program.startTime; 
      event.endDate = weakSelf.program.endTime; 
      [event setCalendar:[store defaultCalendarForNewEvents]]; 
      NSError *err = nil; 
      [store saveEvent:event span:EKSpanThisEvent commit:YES error:&err]; 

      if (err) 
      { 
       UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Calendar Error" message:err.localizedDescription delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
       [alertView show]; 
      } 
      else 
      { 
       UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Added" message:@"Calendar event added." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
       [alertView show]; 
      } 
     } 
    }]; 

và trong iOS 6 có thể mất 6/7 giây (iPhone 4) và trên iOS 7 (trên iPhone 5S) phải mất ~ 10 giây. Đây có phải là hành vi bình thường không? Nếu không phải tôi đang làm gì sai?

Trả lời

12

Tôi gặp vấn đề tương tự. Nhờ câu trả lời của Jasper, tôi đã nghĩ về hàng đợi. Hãy thử điều này:

if (!err) 
    { 
     dispatch_async(dispatch_get_main_queue(), 
     ^{ 
      [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"event added", nil) message:nil delegate:nil cancelButtonTitle:NSLocalizedString(@"ok", nil) otherButtonTitles:nil] show]; 
     }); 
    } 

Dưới đây là tại sao điều này là cần thiết (xem nhấn mạnh)

Thảo luận

Trong iOS 6 và sau đó, yêu cầu quyền truy cập vào một cửa hàng kiện không đồng bộ nhắc nhở người dùng của bạn cho quyền sử dụng dữ liệu của họ. Người dùng chỉ được nhắc lần đầu tiên ứng dụng của bạn yêu cầu quyền truy cập vào loại thực thể; bất kỳ instantiations tiếp theo của EKEventStore sử dụng quyền hiện có. Khi người dùng chạm để cấp hoặc từ chối quyền truy cập, trình xử lý hoàn thành sẽ được gọi trên hàng đợi tùy ý. Ứng dụng của bạn là không bị chặn trong khi người dùng quyết định cấp hoặc từ chối cấp phép.

Vì UIAlertView là UIKit và UIKit luôn yêu cầu chủ đề chính, bất kỳ chuỗi tùy ý nào khác sẽ bị lỗi hoặc dẫn đến hành vi không thể đoán trước.

https://developer.apple.com/library/ios/documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html

+0

Điều thú vị là công trình này - bạn vẫn đang gửi đến hàng đợi chính. –

+1

@JasperBlues xem chỉnh sửa của tôi. – mmackh

+0

Công việc tuyệt vời. @daidai vui lòng thay đổi để chấp nhận câu trả lời này - sẽ hữu ích hơn cho người xem tiếp theo. –

2

Theo tài liệu: "Đối tượng EKEventStore yêu cầu một lượng thời gian tương đối lớn để khởi tạo và phát hành".. . vì vậy bạn nên gửi điều này trên một hàng đợi nền.

Ngoài ra, kỳ quặc, phải mất nhiều thời gian hơn trên hàng đợi chính so với hàng đợi nền - không chắc chắn tại sao lại như vậy!

+0

Đó là điều rất kỳ quặc - trong thử nghiệm của tôi, nó có thể mất đến 30 giây trên các chủ đề chính, trong thời gian đó UI của bạn bị chặn, trong khi đặt nó trong thread khác và nó là khá nhiều ngay lập tức ! – siburb

+0

Tôi phải lưu 40000 Sự kiện và tôi đã sử dụng hàng đợi nền, có cách tiếp cận thân thiện với hiệu suất nào để đạt được điều này không? – Mrug

Các vấn đề liên quan