Настройка прогресса ProgressView при разборе XML - PullRequest
1 голос
/ 25 марта 2011

Я анализирую, используя файл XML.Я хочу показать индикатор выполнения, пока процедура синтаксического анализа не завершится.Как я могу рассчитать прогресс ProgressView ??Просьба помочь ..

Ответы [ 3 ]

6 голосов
/ 27 июля 2012

Сначала посчитайте количество строк.

NSError *error = nil;
NSString *xmlFileString = [NSString stringWithContentsOfURL:url
                           encoding:NSUTF8StringEncoding error:&error];
_totalLines = [xmlFileString componentsSeparatedByString:@"\n"].count;

Затем поймайте прогресс в блоке метода делегата. Например:

- (void)parser:(NSXMLParser *)parser 
  didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI 
  qualifiedName:(NSString *)qName 
  attributes:(NSDictionary *)attributeDict
{
    [self.elementStack addObject:elementName];

    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
    [mainQueue addOperationWithBlock:^{
        _progressView.progress = (CGFloat)[parser lineNumber] / (CGFloat)_totalLines;
    }];
}

Пример проекта здесь:

https://github.com/weed/p120727_XMLParseProgress

ss

5 голосов
/ 25 марта 2011

Если вы анализируете с NSXMLParser и знаете длину анализируемого файла, вы можете приблизить прогресс, вызвав lineNumber для вашего объекта синтаксического анализатора, чтобы сообщить вам, как далеко проходит файл анализатор.

progressView.progress = (CGFloat)[parser lineNumber] / (CGFloat)totalLines;
0 голосов
/ 03 апреля 2014

Я обрабатываю большие файлы, где для подсчета количества строк в файле потребовалось несколько секунд.

Я придумал более сложное, но более быстрое решение:

  • отобразить содержимое файла в виртуальную память, используя NSData. Это самый быстрый способ чтения большого файла на OS X и iOS. Он будет загружен в ОЗУ, если это файл малого / среднего размера, но большие файлы будут загружены в ОЗУ только частично.
  • используя централизованную диспетчеризацию, запустите фоновую задачу, чтобы обработать данные кусками по 10 КБ, подсчитав, сколько строк найдено.
  • запустить еще одну грандиозную центральную диспетчерскую задачу для анализа того же NSData объекта.
  • всякий раз, когда запускается новый тег, каждые полсекунды проверяют, завершился ли подсчет строк, и если да, то обновляется индикатор выполнения.

Отображение файла в виртуальную память и последующий поиск байтов новой строки примерно в 10 раз быстрее, чем любой другой метод, который я смог найти, включая некоторые варианты выбора низкого уровня C. Мне понадобится доля секунды, чтобы подсчитать файл с 3 миллионами строк на моем оборудованном SSD Mac.

Выполнение этого в фоновом потоке, параллельно с NSXMLParser на том же объекте NSData, гарантирует, что файл не будет считан с диска дважды (если файл не слишком велик для размещения в ОЗУ).

Исходный код для этого здесь: https://github.com/abhibeckert/Speed-Limit/blob/master/Speed%20Limit/SLOSMImporter.m

Примечание: код, который я разместил, будет работать на iOS 7 и OS X 10.9. Это было только проверено на OS X 10.9. Его можно довольно легко модифицировать для работы с более старыми версиями SDK, просто соберите его, и ошибки компиляции должны легко исправляться.

...