Разбор XML в другом потоке / одновременно - PullRequest
2 голосов
/ 06 августа 2010

У меня есть приложение, которое получает данные через XML-файлы.Во время синтаксического анализа данные записываются / вставляются в локальную базу данных sqlite3 на устройстве.Таким образом, если данные синхронизированы, появляется экран загрузки (выполняется в фоновом режиме), который сообщает пользователю, что данные синхронизированы.

Это работает очень хорошо с помощью следующего кода:

Часть экрана загрузки:

[self.view performSelectorInBackground:@selector(addSubview:) withObject:self.updateView];
[self.view performSelectorInBackground:@selector(bringSubviewToFront:) withObject:self.updateView];

for (NSURL *url in urlArray)
{
    // Set up a UILabel so the user can see which data is syncronized
    [self.updateLabel performSelectorInBackground:@selector(setText:) withObject:[NSString stringWithFormat:@"%@",url]];

    // Parsing part
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

    // Setting the database-manager as delegate
    [xmlParser setDelegate:self.datencontroller];
    [xmlParser parse];
    [xmlParser release];
    [url release];
}

[self.updateView removeFromSuperview];

Теперь у меня возникла следующая проблема: очевидно, парсинг блокирует работающее приложение.Поскольку я хочу реализовать метод cancel, чтобы пользователь мог прервать синхронизацию, у меня возникла проблема.

Никаких действий не замечено, пока часть синтаксического анализа не будет выполнена / завершена.Так что реализовать кнопку, вызывающую метод cancel, совершенно бесполезно, если приложение не замечает нажатие кнопки.

Я пробовал несколько способов выполнения в фоновом режиме и т. Д., Но у меня возникла проблемаменеджер данных хранит данные в одной базе данных.Таким образом, нет способа получить к нему доступ одновременно двумя различными способами и вставить данные.

Может кто-нибудь из вас помочь мне в этом?Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 07 августа 2010

Никогда не обновляйте интерфейс из фоновых потоков.Всегда выполняйте UI-обновление селекторов в главном потоке.

0 голосов
/ 07 августа 2010

Как мне остановить NSXMLParser?

это решение может дать некоторые рекомендации

0 голосов
/ 06 августа 2010

Базы данных Sqlite3 могут быть доступны из нескольких потоков;вам просто нужно открыть свой дескриптор базы данных для каждого потока.

...