0

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

我知道 NSXMLParser 的 parse 方法是同步的,它应该阻塞直到 XML 解析完成。这正如我在单元测试中所期望的那样工作。但是,在我的成功块的上下文中,它似乎调用 NSXMLParser:parse 然后继续执行。我将(初始化的)解析器传递给一个对象,它是 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

这个对象的“parse”方法简单调用 NSXMLParser:parse

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

};

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

-(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 委托方法被调用。奇怪的。

4

1 回答 1

0

如果一个NSXMLParser实例在没有调用任何委托方法的情况下返回parse,那么它很可能遇到了错误。检查返回值parseNO如果失败则返回)以及parserError方法(NSError如果设置了则返回)。解析器设置错误但仍然成功并非不可能,因此请确保您的决定基于返回值,而不是错误的存在(这是既定的 Cocoa 约定)。

于 2013-09-04T17:38:55.290 回答