NSXMLParser解析似乎在我的块中异步运行

时间:2013-09-04 16:44:01

标签: ios objective-c afnetworking objective-c-blocks nsxmlparser

我必须忽略一些愚蠢的事情。我正在使用AFNetworking来执行返回XML内容的HTTP GET请求。当请求返回时,我的成功块执行。我正在使用NSXMLParser来解析XML并返回结果。

我知道NSXMLParser的parse方法是同步的,它应该阻塞,直到XML解析完成。这正如我在单元测试中所期望的那样。但是在我的成功块的上下文中,它似乎调用NSXMLParser:解析然后继续执行。我将(初始化的)解析器传递给NSXMLParser委托的对象。在此对象中调用解析以初始化成员数据。所以我需要在块完成执行之前完成解析。

所以我的解析对象看起来像这样:

    @interface Content : NSObject <NSXMLParserDelegate>

@property (readonly) NSXMLParser *xmlParser;
@property (readonly) NSString *documentTitle;
@property (readonly) NSMutableArray *sectionTitles;
@property (readonly) NSString *documentFormat;
@property (readonly) NSString *localization;
@property (readonly) NSString *contentVersion;

- (id)initWithParser:(NSXMLParser *)xmlParser;
- (BOOL)parse;

@end

此对象的“解析”方法简单调用NSXMLParser:parse

-(BOOL)parse{
NSLog(@"%@", @"calling parse");//this is in the output
return [xmlParser parse]; // return parse success or error

};

在我的服务调用中,我调用此对象的构造函数并提供NSXMLParser。然后我立即调用这个对象的“解析”方法。然而,块似乎调用解析并继续执行(如异步调用)并返回此对象未初始化。

-(void)makeHttpRequest:(NSURL *)url
             onSuccess:(ContentSuccess)success //this a block that client code passes in are blocks
             onFailure:(ContentFailure)failure{
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];
    [operation  setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithData:responseObject];
        Content *content = [[Content alloc]initWithParser:xmlParser];
        [content parse]; // this gets called but it's not blocking
        success(kbContent); // this gets called right away with ivar == nil
    }
                                      failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                          failure(error);

                                      }
     ];
    [operation start];

}

这必须与我的块实现有关。就像我说[内容解析]似乎在我的单元测试中同步工作。但它们不是在块的上下文中运行的。有人可以提供一些建议吗?

谢谢!

更新

似乎我的Content:parse方法返回'NO',这表示解析错误。但是NSXMLParser.pasererror是'nil'。如果我简单地从成功块传回NSXMLParser对象,那么解析就没有问题。在块中,没有调用任何Parser委托方法。奇怪。

1 个答案:

答案 0 :(得分:0)

如果NSXMLParser实例从parse返回而未调用任何委托方法,则可能会遇到错误。检查parse的返回值(如果失败则返回NO)以及parserError方法(如果已设置,则返回NSError)。解析器设置错误但仍然成功并非不可能,因此请确保根据返回值做出决策,而不是出现错误(这是established Cocoa convention)。