#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 для обработки взаимодействия с пользователем.
Ваше решение должно быть следующим:
- Создайте рабочий поток при запуске приложения.
- Используйте класс контейнера (списка) для хранения «рабочей очереди», в которую вы будете размещать работу для рабочего потока. Вам нужно будет реализовать свой собственный класс или структуру для описания каждой выполняемой рабочей единицы.
- Используйте механизм синхронизации для управления доступом к рабочей очереди из обоих потоков.
- Выполните как можно больше работы в рабочем потоке (т. Е. Получите его для извлечения, а также для анализа XML). Я бы подумал, что доступ к сети здесь является наиболее трудоемкой задачей.
- Попросите рабочий поток обновить элементы пользовательского интерфейса новым контентом. Здесь также необходимо решить проблему синхронизации.
- Завершите рабочий поток при завершении работы приложения.
Смотрите Эту Документацию Apple по потокам для ознакомления с реализацией этого в iOS.
Комментарии:
1. Спасибо за предложение, я постараюсь обработать это и попытаться реализовать. Я углубляюсь в свою текущую проблему, я заметил, что когда я пытаюсь загрузить новые данные. Мой существующий var
@property (retain, non atomic) NSMutableArray *entityArray
становится пустым. Я попробую дать вам совет и посмотрю, смогу ли я продвинуться дальше. Спасибо