我试图弄清楚是否可以取消对EventKit数据库的查询。我使用与某一周内所有事件匹配的谓词来查询EventKit。此查询可能需要一些时间,具体取决于返回的事件数。
为什么我要这个?好吧,在我的iPhone应用程序中,用户浏览他的日历周。每次向用户显示新的一周时,应用程序都必须加载该周的所有活动。因为这需要几百毫秒,所以应用程序没有应有的响应能力。用户基本上必须浏览一点慢,因为每次浏览到另一周时,用户界面会暂停一段时间。
我已经使用“performSelectorInBackground”在后台线程中运行查询。这仍然会使用户界面停滞不前。我想到的解决方案是,无论何时用户决定浏览到另一周,都会取消当前的EventKit查询。这样做的缺点可能是用户有时没有立即看到该周的事件,因为查询被取消了,但UI有望在任何时候都具有高响应性。
这一切都可能吗?有人知道吗?我可以取消EventKit查询吗?也许通过停止它运行的线程?欢迎任何建议!
答案 0 :(得分: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在另一个线程上执行。