NSXMLParser的parse方法是异步的吗?
换句话说,如果我有一个NSXMLParse对象,并从主线程调用[someParseObject parse]
,它会在执行期间阻塞主线程吗?
NSXMLParser的parse方法是异步的吗?
换句话说,如果我有一个NSXMLParse对象,并从主线程调用[someParseObject parse]
,它会在执行期间阻塞主线程吗?
它不是异步的,因此会阻塞主线程。
NSXMLParser可以解析URL/Data,但如果我们直接解析URL,它会冻结UI(主线程),因此您可以使用NSXMLParser进行数据解析。请查看NSURLConnection API以异步获取数据。
是的,它会阻塞。这里是我如何使用NSInvocationQueue来在解析时不阻塞UI线程...只需使用URL路径作为字符串调用beginParsing,它将处理其余部分:
-(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];
});
});