Когда мне нужно разобрать два файла одновременно, я настраиваю второго делегата для второго файла.Делегат - это простой объект NSO, который придерживается протокола NSXML Parser Delegate.(У него есть parserDidStart
, parserDidEnd
, бла-бла-бла).
Затем в моем didEndElement
моего первого парсера я запускаю второй парсер с чем-то вроде этого
SoundCloudParser *scParser = [[[SoundCloudParser alloc] init]autorelease];
NSOperationQueue *queue = [[[NSOperationQueue alloc] init]autorelease];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:scParser selector:@selector(parseXMLUrl:) object:currentArticle.uriString];
[queue addOperation:operation];
[operation release];
Я делаю это в отдельном потоке, поэтому у вас есть очередь втам.Мой parseXMLUrl: looks just like a regular one, it just sets the delegate to my second delegate object instead of setting it to
self`.
Еще одна вещь, о которой вы должны подумать, это то, что вы работаете в didStartElement
, и я обнаружил, что часто у меня нет никаких значенийв моих переменных синтаксического анализа, пока я не доберусь до didEndElement
.Это было бы чем-то еще для вас, чтобы проверить.
ОБНОВЛЕНИЕ: В будущем, если вы пытаетесь построить что-то вроде ZBarSDK или другого проекта, пожалуйста, так и скажите.Это позволило бы мне сэкономить около получаса с вашим кодом.
По сути, нам нужно создать нового делегата.Давайте назовем это newDelegate
.Настройте его как обычный объект NSO и заставьте его следовать протоколу <NSXMLDelegate>
.Ему нужен mutableArray или словарь для хранения данных, которые он будет анализировать, и ему нужна функция для его запуска.И это все.
Итак, давайте предположим, что вы создали newDelegate.h
и newDelegate.m
в своем проекте и в newDelegate.h, у вас есть #import "Your_App_Delegate.h" @interface newDelegate: NSObject {
NSMutableString *currentElement;
NSMutableArray *currentArticle;
}
- (void)parseXMLUrl:(NSString *)URL;
@end
Итак, теперь в вашем didStartElement
вы бы назвали newDelegate следующим образом:
newDelegate *ndParser = [[[newDelegateParser alloc] init]autorelease];
NSOperationQueue *queue = [[[NSOperationQueue alloc] init]autorelease];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:ndParser selector:@selector(parseXMLUrl:) object:[NSString stringWithFormat:@"http://URL.de/%@",product_link]];
[queue addOperation:operation];
[operation release];
Это запустит второй парсер и передаст ему URL для разбора.Вам понадобится способ получить эти данные, поэтому либо сохраните некоторые результаты в вашем делегате приложения, либо измените метод parseXMLURL второго анализатора, чтобы он возвращал какое-то значение.