因此,我正在编写一个针对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/

10-11 13:04