【发布时间】:2011-02-21 05:14:14
【问题描述】:
NSXMLParser 的 parse 方法是异步的吗?
换句话说,如果我有一个 NSXMLParse 对象并且我从主线程调用 [someParseObject parse],它会在主线程执行其操作时阻塞主线程吗?
【问题讨论】:
标签: iphone objective-c cocoa concurrency nsxmlparser
NSXMLParser 的 parse 方法是异步的吗?
换句话说,如果我有一个 NSXMLParse 对象并且我从主线程调用 [someParseObject parse],它会在主线程执行其操作时阻塞主线程吗?
【问题讨论】:
标签: iphone objective-c cocoa concurrency nsxmlparser
是的,它会阻塞。这是我在解析时如何使用 NSInvocationQueue 来不阻塞 UI 线程...只需调用 beginParsing 并将 url 路径作为字符串,它会处理其余的:
-(void) beginParsing:(NSString*) path{
if(path ==nil)
return;
NSOperationQueue *queue = [[NSOperationQueue new] autorelease];
NSInvocationOperation *operation= [[[NSInvocationOperation alloc]
initWithTarget: self
selector: @selector(createRequestToGetData:)
object: path]
autorelease];
[queue addOperation:operation];
}
-(void)createRequestToGetData:(NSString*)path
{
NSURL* Url = [NSURL URLWithString:path];
NSXMLParser* parser = [[NSXMLParser alloc] initWithContentsOfURL:Url];
[parser setDelegate:self];
NSLog(@"path is %@",path);
[parser parse];
[path release];
[parser release];
}
【讨论】:
你可以像这样异步的 NSXMLParser
dispatch_async( dispatch_get_global_queue(0, 0), ^{
NSString * dovizUrl=@"http://www.tcmb.gov.tr/kurlar/today.xml";
NSURL *url = [NSURL URLWithString:dovizUrl];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
xmlParser.delegate = self;
// call the result handler block on the main queue (i.e. main thread)
dispatch_async( dispatch_get_main_queue(), ^{
// running synchronously on the main thread now -- call the handler
[xmlParser parse];
});
});
【讨论】:
NSXMLParser 可以解析 URL/Data,如果我们直接解析 URL,它会冻结 UI(主线程),而不是你可以使用 NSXMLParser 进行数据解析。请通过 NSURLConnection API 异步获取数据。
【讨论】:
它不是异步的,所以它会阻塞主线程。
【讨论】: