我如何停止NSXMLParser?

时间:2010-02-10 16:51:45

标签: iphone sdk 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;
}

3 个答案:

答案 0 :(得分:9)

调用[parser abortParsing]肯定会停止解析器,但为什么你会期望它停止代码的其余部分 - 你所做的就是让行[parser parse];提前结束 - 解析器可能仍然会返回是的,因为它可能设法成功解析 - 它没有遇到错误,你要求它停止!

由于您的解析器处于单独的线程中,您必须告诉该线程您不再对解析器感兴趣(事实上,此时您将释放解析器,因此它可能不再存在)。

您需要在对象中拥有另一个属性,您的线程将检查

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

希望这有帮助,

萨姆

答案 1 :(得分:0)

在您的代码段中,您将在这两个语句中分配两个不同的解析器:

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

你应该删除第二个声明;更多,你需要改变

[xmlParser setDelegate:parser];

[xmlParser setDelegate:self];

假设您的类也处理解析器的委托方法,否则将其设置为nil

答案 2 :(得分:-1)

将XML解析器的委托设置为nil。