[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;
}
答案 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。