1

EventKitデータベースへのクエリをキャンセルできるかどうかを調べようとしています。特定の週のすべてのイベントに一致する述語を使用してEventKitにクエリを実行します。返されるイベントの数によっては、このクエリに時間がかかる場合があります。

なぜこれが欲しいのですか?さて、私のiPhoneアプリでは、ユーザーは自分のカレンダーの週を閲覧します。新しい週がユーザーに表示されるたびに、アプリはその週のすべてのイベントを読み込む必要があります。これには数百ミリ秒かかるため、アプリは本来あるべきほど応答しません。ユーザーは、別の週を閲覧するたびにユーザーインターフェースが短時間停止するため、基本的に少し遅く閲覧する必要があります。

「performSelectorInBackground」を使用して、バックグラウンドスレッドですでにクエリを実行しています。これはまだユーザーインターフェイスをかなり失速させます。私が考えている解決策は、ユーザーが別の週を参照することを決定するたびに、現在のEventKitクエリがキャンセルされることです。これの欠点は、クエリがキャンセルされたためにユーザーがその週のイベントをすぐに表示しない場合があることですが、UIは常に応答性が高いことを願っています。

それで、これはまったく可能ですか?誰か知っている?EventKitクエリをキャンセルできますか?多分それが実行されているスレッドを停止することによって?どんなアドバイスも大歓迎です!

4

1 に答える 1

2

現時点でクエリをどのように実行しているかは明確ではありません。-[EKEventStore eventsMatchingPredicate:] を使用している可能性がありますか?

別の方法として、-[EKEventStore enumerateEventsMatchingPredicate:usingBlock:] を使用することもできます。指定したブロックは、見つかったイベントごとに 1 回呼び出され、検索を停止する必要があることを知らせることができます。次のようにします。

[eventStore enumerateEventsMatchingPredicate:predicate
       usingBlock:^(EKEvent *event, BOOL *stop) {

          if (event) {
              ...add event to some collection...
          }

          if (shouldStop) {
              *stop = YES;
          }

}];

この呼び出しは同期的ですが、dispatch_async または NSOperation を使用して別のスレッドで実行できます。

于 2011-09-27T17:09:05.987 に答える