Загрузка и анализ XML-документа останавливает мой графический интерфейс в Iphone - PullRequest
2 голосов
/ 16 июля 2009

Я создаю приложение, которое будет читать RSS-каналы и представлять их в UITableViews. Я искал в Google и здесь, и я решил использовать LibXML.

Когда мое приложение запускается, оно проверяет, есть ли у него действующее интернет-соединение, и получает RSS-ленту, из которой я извлекаю некоторые данные и делаю uiTabBar с tableViews. После разбора первого RSS-канала и создания UITabBar для каждой кнопки в моем uiTabBar у меня будет свой RSS-канал (категория). Когда у меня хорошее интернет-соединение (Wi-Fi) и даже 3G, мое приложение работает очень хорошо, но когда интернет-соединение страдает, мое приложение тоже.

Поскольку я анализирую все каналы один за другим, и в главном потоке GUI просто перестает отвечать, и это проблема.

Я использую LibXML для разбора своих каналов, я делаю это так:

CXMLDocument *rssParser = [[[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil] autorelease];

NSArray *resultDate = NULL;
resultDate = [rssParser nodesForXPath:@"//channel" error:nil];

for(CXMLElement *date in resultDate)
{
    NSString *data = (NSString *)[[date childAtIndex:12] stringValue];
    [self setLastBuildDate:[[self parseDate:data] copy]];
    break;
}

NSArray *resultNodes = NULL;
resultNodes = [rssParser nodesForXPath:@"//item" error:nil];

for(CXMLElement *resultElement in resultNodes)
{
    NSMutableDictionary *feed = [[NSMutableDictionary alloc] init];
    int counter;

    for(counter = 0; counter < [resultElement childCount]; counter++)
    {
        [feed setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]];
    }
    [links addObject:[feed objectForKey:@"link"]];
    [feedsList addObject:[feed copy]]; 
    [feed release];
}
[newsTable reloadData];

Я пытался проанализировать только канал для первой кнопки и других, когда нажимаю кнопку на панели uitabbar, но не могу вызвать функции, которые захватывают и анализируют событие подачи на -didselectitem.

Теперь я думал о том, чтобы проанализировать их в другой ветке, а не в основной. Кто-нибудь может дать мне несколько советов?

заранее спасибо

Ответы [ 3 ]

4 голосов
/ 06 августа 2009

Основная проблема заключается в том, что initWithContentsOfURL: блокируется, пока не получит данные из Интернета, что может занять несколько секунд. Если вы вызываете его в главном потоке вашего приложения, оно в основном блокирует все приложение на время сетевого трафика.

Другой вариант - использовать NSURLConnection для сброса данных. Это не так удобно, как одиночный вызов метода initWithContentsOfURL:, но по своей сути асинхронный. Таким образом, вместо того, чтобы реализовывать потоки и обратные вызовы самостоятельно, вы просто реализуете пару методов делегата, а затем создаете экземпляры NSURLConnection.

Для получения дополнительной информации см. Официальную документацию для системы загрузки URL .

1 голос
/ 16 июля 2009

Посмотрите на NSOperation и NSOperationQueue. Они очень полезны для многопоточности.

В основном подкласс NSOperation и напишите свой код в метод main. Затем добавьте свою операцию в очередь операций, и каждая операция будет выполняться в другом потоке.

Вы можете настроить обратные вызовы после завершения ваших операций, чтобы вы могли передавать проанализированные данные обратно в представления.

0 голосов
/ 21 июля 2010

Я выпустил открытый исходный код RSS / Atom Parser для iPhone , который делает чтение и анализ веб-каналов чрезвычайно простым.

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

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