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];を早期に終了するように要求しただけです。エラーが発生しました。停止するように要求しました。

パーサーは別のスレッドにあるため、パーサーに関心がなくなったことをそのスレッドに伝える必要があります (実際、この時点でパーサーをリリースするため、もう存在しない可能性があります)。

スレッドがチェックするオブジェクトに別のプロパティが必要です

@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

コードスニペットでは、次の2つのステートメントで2つの異なるパーサーを割り当てています。

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

2番目のステートメントを削除する必要があります。さらに、あなたは変更する必要があります

[xmlParser setDelegate:parser];

[xmlParser setDelegate:self];

クラスがパーサーのデリゲートメソッドも処理すると仮定します。それ以外の場合は、に設定しnilます。

于 2010-02-10T17:01:46.200 に答える
-1

XML パーサーのデリゲートを nil に設定します。

于 2010-02-10T16:57:07.107 に答える