我一定是忽略了一些愚蠢的事情。我正在使用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 委托方法被调用。奇怪的。