Каков наилучший способ синтаксического анализа XML в фоновом режиме с помощью NSTimer - PullRequest
1 голос
/ 04 октября 2011

Мне нужно асинхронно анализировать XML через регулярные промежутки времени, чтобы, когда пользователь перезагружал UITableView с помощью PullToReload, он загружал обновленные значения. Моя ставка использует NSTimer ...

У меня уже есть парсер XML, использующий TBXML:

- (void) xmlParserWrapper
{
...
TBXMLParser *xmlParser = [[TBXMLParser alloc] initWithContext:context];
[xmlParser performSelectorInBackground:@selector(parseXMLFileAtURL:) withObject:xmlUrl];
}

Итак, я попытался использовать NSTimer

{
...
[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(xmlParserWrapper) userInfo:nil repeats:YES];
}

Это прекрасно работает, если пользователь не будет касаться GUI при разборе. Но когда пользователь щелкает UITableViewCell, ему необходимо отправить новый UITableView в UINavigationController и извлечь данные на основе выбранного значения ячейки; так как NSManagedContext пуст во время синтаксического анализа (пока он не заполнен), приложение зависло из-за 'Неверный предикат: nil RHS'.

Мой код становится очень большим, поэтому я не могу вставить его сюда, но, пожалуйста, дайте мне знать, какую часть кодов вам нужно увидеть, и я добавлю его сюда.

По сути, мне просто нужно регулярно выполнять синтаксический анализ XML в фоновом режиме, который не приведет к сбою приложения. Мне также нужно, чтобы он был в другом потоке, чтобы он не блокировал MainThread при переходе пользователя к пользовательскому интерфейсу.

Заранее спасибо, dfox

1 Ответ

0 голосов
/ 04 октября 2011

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

Ваше решение должно быть следующим:

  1. Создание рабочего потока при запуске приложения.
  2. Использование класса контейнера (списка) для хранения «рабочей очереди»на котором вы разместите работу для рабочего потока.Вам нужно будет реализовать свой собственный класс или структуру для описания каждого выполняемого рабочего блока.
  3. Используйте механизм синхронизации для управления доступом к рабочей очереди из обоих потоков.
  4. Выполните столько работы, скольковозможно в рабочем потоке (т. е. заставить его извлекать, а также анализировать XML).Я бы подумал, что доступ к сети - самая трудоемкая задача.
  5. Получите рабочий поток для обновления элементов пользовательского интерфейса новым содержимым.Здесь также необходимо решить проблему синхронизации.
  6. Завершить рабочий поток при завершении работы приложения.

См. Эту Документацию Apple для потоков, длявведение в реализацию этого под iOS.

...