1

我究竟做错了什么?我无法让 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;
}
4

3 回答 3

9

调用[parser abortParsing]肯定会停止解析器,但您为什么希望它停止其余代码 - 您所做的只是要求该行[parser parse];提前结束 - 解析器可能仍会返回 YES,因为它可能已成功解析 - 它没有t 遇到错误,您要求它停止!

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

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

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

希望这可以帮助,

山姆

于 2010-02-10T17:26:46.050 回答
0

在您的代码片段中,您在以下两个语句中分配了两个不同的解析器:

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

您应该删除第二条语句;此外,你需要改变

[xmlParser setDelegate:parser];

[xmlParser setDelegate:self];

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

于 2010-02-10T17:01:46.200 回答
-1

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

于 2010-02-10T16:57:07.107 回答