2013-10-14 44 views
10

我只是想将事件添加到设备的日历中。将事件添加到日历非常慢

我使用:

__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]; 
      } 
     } 
    }]; 

和在IOS 6它可以采取6/7秒(iPhone 4)和iOS 7(在iPhone 5S)需要约10秒。这是正常的行为吗?如果不是我做错了什么?

回答

12

我有同样的问题。感谢贾斯珀的回答,我想到了排队。试试这个:

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]; 
     }); 
    } 

这也是为什么这是需要(见强调)

讨论

在iOS 6中,后来,请求访问事件存储 异步提示用户进行许可使用他们的数据。 仅当您的应用第一次请求访问 实体类型时才会提示用户; EKEventStore的任何后续实例均使用 现有权限。 当用户点击以授予或拒绝访问时,将在任意队列上调用完成处理程序。你的应用程序是 未被阻止,而用户决定授予或拒绝权限。

由于UIAlertView是UIKit,并且UIKit总是需要主线程,所以其他任意线程都会崩溃或导致不可预知的行为。

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

+0

有趣的是,这个工程 - 你仍然调度到主队列。 –

+1

@JasperBlues看到我的编辑。 – mmackh

+0

不错的工作。 @daidai请改变接受这个答案 - 对后续观众更有用。 –

2

根据文档:“EKEventStore对象需要相对较多的时间来初始化和释放。”。 。所以你应该在后台队列上调度它。

另外,奇怪的是,它在主队列上比在背景队列中需要更长的时间 - 不知道这是为什么!

+0

那是很奇怪的事情 - 在我的测试中,它可能需要长达主线程30秒,在此期间,您的UI被阻塞,而把它放在另一个线程,这是非常直接的! – siburb

+0

我必须保存40000个事件,并且我已经使用后台队列,有没有任何性能友好的方法来实现这一目标? – Mrug