在我的应用中,我会在应用启动后立即阅读日历。因此,按照指南第一次,我的应用程序要求进行日历访问,但正在发生的事情是它永远不会出现,我只能看到闪屏。
当我关闭应用程序时,我会看到弹出窗口,用于授予我手机上日历的访问权限。我允许访问它,在那之后一切正常。
这是我的代码:
-(NSArray*) listOfEventsInCalendar
{
_eventStore = [[EKEventStore alloc]init];
__block NSArray * events;
if ([_eventStore respondsToSelector:@selector(requestAccessToEntityType:completion:)])
{
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
/* iOS Settings > Privacy > Calendars > MY APP > ENABLE | DISABLE */
[_eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error)
{
if ( granted )
{
NSDate * startDate = [NSDate date];
NSDate * endDate = [NSDate distantFuture];
NSPredicate * predicate = [_eventStore predicateForEventsWithStartDate:startDate endDate:endDate calendars:nil];
events = [_eventStore eventsMatchingPredicate:predicate];
if (events) {
insideArray = [self castEvents:events];
}
else{
NSLog(@"No Events found in the calendar");
}
}
else
{
NSLog(@"User has not granted permission!");
}
dispatch_semaphore_signal(sema);
}];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
return insideArray;
}
我做错了什么?
谢谢,
答案 0 :(得分:0)
问题很简单。您使用信号量阻止主线程。这是一个坏主意。
没有listOfEventsInCalendar
阻止。让它立即返回。让完成块处理结果。一种选择是在您的listOfEventsInCalendar
方法中添加一个块参数。然后从完成块调用块传递获取的数组。