2012-02-09 19 views
3

構文解析がうまく機能します。NSXMLParserがバックグラウンドで動作しない

-(void) callParse 
{ 
parser = [[NSXMLParser alloc] initWithData:data]; 
parser.delegate = self; 
[parser parse]; 
[parser release]; 
} 

構文解析をバックグラウンドで実行します。このコードは解析を行いません。しかし、なぜ?

@interface NSXMLParser(Private) 
- (void)myParse; 
@end 

@implementation NSXMLParser(Private) 
- (void)myParse 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [self parse]; 
    [pool drain]; 
} 
@end 

-(void) callParse2 
{ 
parser = [[NSXMLParser alloc] initWithData:data]; 
parser.delegate = self; 
[NSThread detachNewThreadSelector:@selector(myParse) toTarget:parser withObject:nil]; 
[parser release]; 
} 

UPDATE:私はcallParse2を4回呼び出し、4つのスレッドを作成します。それはいくつかの解析を行いますが、結果は乱雑です。私は同期変数にいくつか問題があるかもしれません。 NSXMLParserは、非原子的プロパティを使用するデリゲートを呼び出します。

答えて

4

カテゴリメソッドではうまくいかないのですが、あなたがNSXMLParserを呼び出しているオブジェクトのスレッドをアクティブにしようとしましたか?

- (void)startParsing{ 
//... 

    [NSThread detachNewThreadSelector:@selector(parseXML:) 
        toTarget:self withObject:parseData]; 

//.. 
} 

- (void)parseXML:(id)parseData 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSXMLParser * parser = [[NSXMLParser alloc] initWithData:parseData]; 
    parser.delegate = self; 
    [parser parse]; 
    [parser release]; 
    [pool drain]; 
} 
+0

このコードは、このメソッドを4回呼び出すと機能しますか? – Voloda2

+0

はい、4つの新しいスレッドがそれぞれ独自のパーサーオブジェクトとともに開きます。代理人が4つの別々のパーサーを処理できる場合は、大丈夫です。 –

関連する問題