iPhone - Есть ли способ отменить запрос к базе данных EventKit? - PullRequest
1 голос
/ 27 сентября 2011

Я пытаюсь выяснить, можно ли отменить запрос к базе данных EventKit.Я запрашиваю EventKit с помощью предиката, который соответствует всем событиям за определенную неделю.Этот запрос может занять некоторое время в зависимости от того, сколько событий возвращено.

Зачем мне это нужно?Ну, в моем приложении для iPhone пользователь просматривает недели своего календаря.Каждый раз, когда пользователю показывается новая неделя, приложение должно загружать все события за эту неделю.Поскольку это занимает пару сотен миллисекунд, приложение не так отзывчиво, как должно быть.Пользователь в основном должен просматривать немного медленнее, потому что пользовательский интерфейс останавливается на короткое время каждый раз, когда он просматривает другую неделю.

Я уже выполняю запрос в фоновом потоке, используя "executeSelectorInBackground".Это все еще немного останавливает пользовательский интерфейс.Решение, о котором я думаю, состоит в том, что всякий раз, когда пользователь решает перейти на другую неделю, текущий запрос EventKit отменяется.Недостатком этого является, вероятно, то, что пользователь иногда не видит события той недели сразу, потому что запрос был отменен, но, надеюсь, пользовательский интерфейс всегда будет очень отзывчивым.

Так что это вообще возможно?Кто-нибудь знает?Могу ли я отменить запрос EventKit?Может быть, остановив поток, в котором он работает?Любой совет приветствуется!

1 Ответ

2 голосов
/ 27 сентября 2011

Непонятно, как вы выполняете запрос в данный момент.Возможно использование - [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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...