Как остановить NSXMLParser?

Что я делаю неправильно? я не могу заставить 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;
}

person nathanjosiah    schedule 10.02.2010    source источник


Ответы (3)


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

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

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

@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");
    ...

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

Сэм

person deanWombourne    schedule 10.02.2010
comment
... вау, никогда об этом не думал, я не знаю, почему я думал, что это остановит запуск кода ... спасибо, хотя :) - person nathanjosiah; 10.02.2010

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

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

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

[xmlParser setDelegate:parser];

to

[xmlParser setDelegate:self];

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

person Massimo Cafaro    schedule 10.02.2010
comment
нет, потому что XMLParser — это мой NSObject. это делегат моего парсера. NSXMLParser — это настоящий синтаксический анализатор. анализатор объектов имеет методы делегата. я не хочу, чтобы сам занимался разбором - person nathanjosiah; 10.02.2010

Установите для делегата синтаксического анализатора XML значение nil.

person bpapa    schedule 10.02.2010
comment
@bpapa ясно, что вы не пробовали свое решение, прежде чем предлагать его публике .. это позор .. !! - person newton_guima; 21.06.2012