Как мне остановить NSXMLParser? - PullRequest
1 голос
/ 10 февраля 2010

что я делаю не так? я не могу заставить xmlparser прекратить анализ. я установил точку останова на [xmlParser abortParsing];, и она запускается но так же все делает после if(success) вот мой код:

-(void)viewDidLoad{

[NSThread detachNewThreadSelector:@selector(loadstuff)toTarget:self withObject:nil];

}

-(void)loadstuff{

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

 XMLParserdelegate *parserdeleagte = [[XMLParserdelegate alloc] init];
 [xmlParser setDelegate:parserdelegate];

 BOOL success = [xmlParser parse];

 if(success){
  NSLog(@"No Errors");

  links = [[NSMutableArray alloc] initWithArray:links];
  titles = [[NSMutableArray alloc] initWithArray:titles];
  dates = [[NSMutableArray alloc] initWithArray:dates];
  descriptions = [[NSMutableArray alloc] initWithArray:descriptions];

  loading = FALSE;
  [theTableView reloadData];
 }else{
  NSLog(@"Error parsing xml"); 
 }
 [pool release];
}

-(void)viewWillDisappear:(BOOL)animated{
 [super viewWillDisappear:animated];
 [xmlParser abortParsing];
 [xmlParser release];
 xmlParser = nil;
}

Ответы [ 3 ]

9 голосов
/ 10 февраля 2010

Вызов [parser abortParsing], безусловно, остановит синтаксический анализатор, но почему вы ожидаете, что он остановит остальную часть вашего кода - все, что вы сделали, - попросили строку [parser parse]; завершить досрочно - анализатор все равно может вернуть YES, как мог бы удалось успешно разобрать - ошибка не возникла, вы попросили ее остановить!

Поскольку ваш синтаксический анализатор находится в отдельном потоке, вы должны будете сообщить этому потоку, что он вам больше не интересен (фактически, вы освободите синтаксический анализатор на этом этапе, поэтому он может больше не существовать).

Вам понадобится другое свойство в вашем объекте, которое ваша нить проверит

@property (assign) BOOL cancelThread; // deliberate lack of nonatomic here!

Установите это значение в false перед тем, как отсоединить новую тему:

- (void) viewDidLoad {
    self.cancelThread = NO;
    [NSThread detachNewThreadSelector:@selector(loadstuff)toTarget:self withObject:nil];
}

и затем, внутри вашего viewWillDisappear метода, установите для него значение YES:

- (void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.cancelThread = YES;
    [xmlParser abortParsing];
    [xmlParser release];
    xmlParser = nil;
}

Наконец, проверьте это свойство в своей ветке, чтобы увидеть, нужно ли вам заканчивать раньше, т.е.

...
BOOL success = [xmlParser parse];

if (self.cancelThread) {
    [pool release];
    return;
}

if (success) {
    NSLog(@"No Errors");
    ...

Надеюсь, это поможет,

Sam

0 голосов
/ 10 февраля 2010

В своем фрагменте кода вы выделяете два разных синтаксических анализатора в этих двух операторах:

xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
XMLParser *parser = [[XMLParser alloc] init];

Вы должны удалить второе выражение;более того, вам нужно изменить

[xmlParser setDelegate:parser];

на

[xmlParser setDelegate:self];

, если ваш класс также обрабатывает методы делегата синтаксического анализатора, в противном случае установите его на nil.

0 голосов
/ 10 февраля 2010

Установите делегат анализатора XML на ноль.

...