0

在我的应用程序中,我会在应用程序启动后立即阅读日历。因此,根据指南,我的应用程序第一次要求访问日历,但发生的事情是它永远不会出现,我只能看到启动画面。

当我关闭应用程序时,我会看到允许访问我手机上的日历的弹出窗口。我授予对它的访问权限,之后一切正常。

这是我的代码:

-(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;
}

我究竟做错了什么??

谢谢,

4

1 回答 1

0

问题很简单。您正在用信号量阻塞主线程。这是一个坏主意。

没有你的listOfEventsInCalendar障碍。让它立即返回。让完成块处理结果。一种选择是将块参数添加到您的listOfEventsInCalendar方法中。然后从传递获得的数组的完成块中调用块。

于 2014-03-15T03:32:36.907 回答