2013-10-14 17 views
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)を取ることができ、(iPhone 5S上)のiOS 7の上に、それは〜10秒かかります。これは正常な動作ですか?私は何が間違っているのでしょうか?

答えて

12

私は同じ問題がありました。ジャスパーの答えのおかげで、私は待ち行列を考えました。これが必要な理由

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

+0

これは面白いことですが、あなたはまだメインキューにディスパッチしています。 –

+1

@JasperBluesは私の編集を参照してください。 – mmackh

+0

いい仕事です。 @daidaiはこの回答を受け入れるように変更してください - それ以降の視聴者にはもっと役立つでしょう。 –

2

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

また、奇妙なことに、メインキューではバックグラウンドキューよりも時間がかかります。

+0

非常に奇妙なことだこと - 別のスレッドでそれを入れて、それはかなりすぐにであるのに対し、私のテストでは、それは、あなたのUIがブロックされ、その間、メインスレッド上で30秒かかる可能性があり! – siburb

+0

私は40000イベントを保存しなければなりません。すでにバックグラウンドキューを使用していますが、これを達成するためのパフォーマンスに優しいアプローチはありますか? – Mrug

関連する問題