1

我试图弄清楚是否可以取消对 EventKit 数据库的查询。我使用与某一周内的所有事件匹配的谓词查询 EventKit。此查询可能需要一些时间,具体取决于返回的事件数。

我为什么要这个?好吧,在我的 iPhone 应用程序中,用户浏览了他日历中的星期。每次向用户显示新的一周时,应用程序都必须加载该周的所有事件。因为这需要几百毫秒,所以应用程序没有应有的响应。用户基本上不得不慢一点浏览,因为用户界面每次浏览到另一个星期时都会停顿一会儿。

我已经使用“performSelectorInBackground”在后台线程中运行查询。这仍然使用户界面停滞不前。我正在考虑的解决方案是,每当用户决定浏览另一周时,都会取消当前的 EventKit 查询。这样做的缺点可能是用户有时不会立即看到该周的事件,因为查询已被取消,但 UI 希望始终保持高度响应。

那么这有可能吗?有人知道吗?我可以取消 EventKit 查询吗?也许通过停止它正在运行的线程?欢迎任何建议!

4

1 回答 1

2

目前尚不清楚您是如何执行查询的。可能使用 -[EKEventStore eventsMatchingPredicate:]?

另一种方法可能是使用 -[EKEventStore enumerateEventsMatchingPredicate:usingBlock:]。您提供的块会为找到的每个事件调用一次,您可以发出信号指示搜索应该停止。执行以下操作:

[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 回答