我如何停止NSXMLParser?

nat*_*iah 1 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;
}
Run Code Online (Sandbox Code Playgroud)

dea*_*rne 9

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

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

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

@property (assign) BOOL cancelThread; // deliberate lack of nonatomic here!
Run Code Online (Sandbox Code Playgroud)

在分离新线程之前将其设置为false:

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

然后,在您的viewWillDisappear方法中,将其设置为YES:

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

最后,检查你的线程中的这个属性,看看你是否需要尽早结束ie

...
BOOL success = [xmlParser parse];

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

if (success) {
    NSLog(@"No Errors");
    ...
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助,

山姆