我只是想在设备的日历中添加一个事件。
我正在使用:
__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秒。这是正常的行为吗?如果不是我做错了什么?
答案 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总是需要主线程,因此任何其他任意线程都会崩溃或导致不可预测的行为。
答案 1 :(得分:2)
根据文档:“EKEventStore对象需要相对较长的时间来初始化和释放。”。 。所以你应该在后台队列上发送它。
另外,奇怪的是,主队列需要的时间比后台队列长 - 不知道为什么会这样!