因此,我正在编写一个针对API进行身份验证的函数,该API返回包含我想传递的内容的XML文档。该函数可以很容易地使用NSURLConnection的sendSynchronousRequest
方法进行同步调用。但是,一旦此方法返回,我就需要实例化NSXMLParser的实例,用数据初始化它,让它解析,等等,等等。
我想做的是在我的函数中(在sendSynchronousRequest
返回之后),实例化NSXMLParser,为它提供要解析的数据,并在单个方法调用中,使其开始解析,直到解析结束后才返回。
例如:
- (void) myFunction
{
/* other code */
NSData *returnedData = [NSURLConnection sendSynchronousRequest:authRequest returningResponse:&authResponse error:&authError];
MyParserClass *parser = [[MyParserClass alloc] initWithData:returnedData];
[parser parseData];
}
在上面的示例中,
MyParserClass
是NSXMLParser委托,并且以通常的委托方式进行所有解析。 parseData
将开始解析,直到解析结束才返回。我应该以哪种方式写
parseData
?封锁方法?编辑:我只记得NSXMLParser中的-parse函数是同步的。不过,我很想知道是否有人可以在任何异步类中解释实现此目的的方法。
最佳答案
我建议编写一个实现NSXMLParserDelegate
协议的类(例如MyParserDelegate
)。当解析器调用委托方法时,它应使用要从XML文件提取的信息来构建数据结构。我称其为:
//创建委托
MyParserDelegate * delegate = [[[MyParserDelegate alloc] init];
//创建解析器
NSXMLParser * parser = [[NSXMLParser alloc] initWithData:returnedData];
[parser setDelegate:delegate];
//解析文件
如果([解析器解析])
{
// XML是有效的,并且没有错误地进行了解析
//现在,对提取的数据进行处理
//例如,self.xmlData = [delegate xmlBasedDataStructureBuiltByDelegate];
}
其他
{
// XML无效
//处理错误
}MyParserDelegate
的功能完全取决于您要从XML文件中提取的内容。我建议阅读Apple的Event-Driven XML Programming Guide了解更多信息。
请记住,如果要使用同步NSURLConnection
,则应在后台线程上执行此操作。
关于objective-c - 使异步 cocoa 类以同步方式工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4578709/