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ブロックを持っていません。すぐに戻しましょう。完了ブロックに結果を処理させます。1 つのオプションは、listOfEventsInCalendarメソッドにブロック パラメーターを追加することです。次に、取得した配列を渡して完了ブロックからブロックを呼び出します。

于 2014-03-15T03:32:36.907 に答える