将事件添加到日历非常慢

dai*_*dai 10 objective-c ios 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];
             }
         }
     }];
Run Code Online (Sandbox Code Playgroud)

在iOS 6中,它可能需要6/7秒(iPhone 4),在iOS 7上(在iPhone 5S上)则需要约10秒.这是正常的行为吗?如果不是我做错了什么?

mma*_*ckh 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];
        });
    }
Run Code Online (Sandbox Code Playgroud)

这就是为什么需要这样做(见重点)

讨论

在iOS 6及更高版本中,请求异步访问事件存储会提示您的用户获得使用其数据的权限.仅在您的应用首次请求访问实体类型时才会提示用户; EKEventStore的任何后续实例化都使用现有权限.当用户点击以授予或拒绝访问时,将在任意队列上调用完成处理程序.当用户决定授予或拒绝权限时,您的应用不会被阻止.

由于UIAlertView是UIKit,并且UIKit总是需要主线程,因此任何其他任意线程都将崩溃或导致不可预测的行为.

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