2011-09-27 2 views
1

私は、EventKitデータベースへのクエリをキャンセルすることが可能かどうかを調べようとしています。特定の週のすべてのイベントに一致する述語でEventKitを照会します。このクエリには、返されるイベントの数に応じて時間がかかることがあります。iPhone - EventKitデータベースへのリクエストをキャンセルする方法はありますか?

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

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

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

答えて

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を持つ別のスレッドで実行できます。

+0

はい、あなたは正しいイベントです。マッチングプレディケートは、私が現在イベントをフェッチしている現在の方法です。ドキュメントでもあなたが提案している方法がわかりました。しかし、私はすぐにそれを試してみると、私のアプリが完全に止まってしまったように思えた(無限ループ?)。たぶん私はそれを正しく使用しなかったでしょう。私はもう一度試してみる、これは行く方法のように思える!ありがとう! –

関連する問題