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总是需要主线程,因此任何其他任意线程都将崩溃或导致不可预测的行为.
归档时间: |
|
查看次数: |
1597 次 |
最近记录: |