Каков наилучший способ анализа XML в фоновом режиме с помощью NSTimer

#ios #uitableview #core-data #xml-parsing

#iOS #uitableview #core-data #xml-синтаксический анализ

Вопрос:

Мне нужно асинхронно анализировать 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];
}
  

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

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

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

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

Ответ №1:

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

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

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

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

Комментарии:

1. Спасибо за предложение, я постараюсь обработать это и попытаться реализовать. Я углубляюсь в свою текущую проблему, я заметил, что когда я пытаюсь загрузить новые данные. Мой существующий var @property (retain, non atomic) NSMutableArray *entityArray становится пустым. Я попробую дать вам совет и посмотрю, смогу ли я продвинуться дальше. Спасибо