2012-02-09 80 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]; 
} 

更新:我呼叫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

如果您四次調用此方法,此代碼是否有效? – Voloda2 2012-02-09 15:43:33

+0

是的,它會用它自己的解析器對象打開4個新線程。只要你的委託可以處理4個獨立的解析器,那麼它應該沒問題。 – 2012-02-09 15:44:34