2013-11-15 4 views
0

У меня есть XML Parser, что, когда он начинает это делает все приложения замораживания до тех пор, пока не закончится, я называю парсер с помощью:XML Parser блокирует основной поток

xmlParser = [[XMLParser alloc] loadXMLByURL:@"http://abdelelrafa.com/test2.xml"]; 

Что является лучшим способом, чтобы иметь Работа с парсером XML без нарушения основного потока? Я хочу знать, лучше ли использовать другой поток или использовать что-то еще.

ответ

1

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

В зависимости от размера вашего документа, вы можете обнаружить, что лучше сначала получить содержимое URL в NSData с использованием NSURLConnection, который делает свою работу, не блокируя основной поток, а затем вызвать [XMLParser initWithData] когда у вас есть данные , Это дает дополнительное преимущество, которое можно фактически решить с ошибками в сети отдельно от ошибок XML.

1

Попробуйте использовать ГКД, чтобы сделать эту операцию для вас:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    xmlParser = [[XMLParser alloc] loadXMLByURL:@"http://abdelelrafa.com/test2.xml"]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Update UI 
    }); 
}); 

Введите dispatch_async на новую очереди, в этом блоке сделать все туры сетевых операций/XML разбор затем создать другие dispatch_async этот раз на главную очереди поэтому вы можете обновлять элементы пользовательского интерфейса или обратный вызов для завершения/отказа

Смежные вопросы