【问题标题】:Is NSXMLParser's parse method asynchronousNSXMLParser的parse方法是异步的吗
【发布时间】:2011-02-21 05:14:14
【问题描述】:

NSXMLParser 的 parse 方法是异步的吗?

换句话说,如果我有一个 NSXMLParse 对象并且我从主线程调用 [someParseObject parse],它会在主线程执行其操作时阻塞主线程吗?

【问题讨论】:

    标签: iphone objective-c cocoa concurrency nsxmlparser


    【解决方案1】:

    是的,它会阻塞。这是我在解析时如何使用 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];
    }
    

    【讨论】:

    • 你为什么要释放路径参数?
    【解决方案2】:

    你可以像这样异步的 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];
        });
    });
    

    【讨论】:

    • [xmlParser parse] 在主线程上运行并将阻塞它。您只需异步初始化方法。
    • @PhilipKramarov 说了什么。
    【解决方案3】:

    NSXMLParser 可以解析 URL/Data,如果我们直接解析 URL,它会冻结 UI(主线程),而不是你可以使用 NSXMLParser 进行数据解析。请通过 NSURLConnection API 异步获取数据。

    【讨论】:

      【解决方案4】:

      它不是异步的,所以它会阻塞主线程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-10
        • 1970-01-01
        • 2011-12-29
        • 2021-04-18
        • 2014-12-17
        • 2018-07-18
        相关资源
        最近更新 更多