我必须忽略一些愚蠢的事情。我正在使用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委托方法。奇怪。
答案 0 :(得分:0)
如果NSXMLParser
实例从parse
返回而未调用任何委托方法,则可能会遇到错误。检查parse
的返回值(如果失败则返回NO
)以及parserError
方法(如果已设置,则返回NSError
)。解析器设置错误但仍然成功并非不可能,因此请确保根据返回值做出决策,而不是出现错误(这是established Cocoa convention)。