10

デバイスのカレンダーにイベントを追加したいだけです。

私は使用しています:

 __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 秒かかります。これは正常な動作ですか?そうでない場合、私は何を間違っていますか?

4

2 に答える 2

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 は常にメイン スレッドを必要とするため、他の任意のスレッドはクラッシュするか、予期しない動作につながります。

https://developer.apple.com/library/ios/documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html

于 2013-10-19T13:22:25.170 に答える
2

ドキュメントによると、「EKEventStore オブジェクトは、初期化と解放に比較的長い時間が必要です。」. . したがって、これをバックグラウンド キューにディスパッチする必要があります。

また、奇妙なことに、バックグラウンド キューよりもメイン キューの方が時間がかかります - これがなぜなのかはわかりません!

于 2013-10-17T03:04:01.783 に答える