将事件添加到日历非常慢

时间:2013-10-14 07:59:57

标签: ios objective-c ekevent ekeventkit

我只是想在设备的日历中添加一个事件。

我正在使用:

 __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秒。这是正常的行为吗?如果不是我做错了什么?

2 个答案:

答案 0 :(得分:12)

我有同样的问题。感谢Jasper的回答,我考虑了队列。试试这个:

    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

答案 1 :(得分:2)

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

另外,奇怪的是,主队列需要的时间比后台队列长 - 不知道为什么会这样!