使异步Cocoa类以同步方式工作

时间:2011-01-02 14:10:20

标签: objective-c cocoa cocoa-touch ios

所以我正在编写一个函数,该函数对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函数是同步的。不过,我很想知道是否有人可以解释在任何类型的异步类中执行此操作的方法。

1 个答案:

答案 0 :(得分:3)

我建议编写一个实现NSXMLParserDelegate协议的类(例如,MyParserDelegate)。当解析器调用委托方法时,它应该构建一个包含要从XML文件中提取的信息的数据结构。我打电话给它如下:

// create the delegate
MyParserDelegate *delegate = [[MyParserDelegate alloc] init];

// create the parser
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:returnedData];
[parser setDelegate:delegate];

// parse the file
if ([parser parse])
{
    // the XML was valid and parsed without error
    // now, do something with the data you extracted
    // e.g., self.xmlData = [delegate xmlBasedDataStructureBuiltByDelegate];
}
else
{
    // the XML was invalid
    // handle the error
}

MyParserDelegate的功能完全取决于您要从XML文件中提取的内容。我建议您阅读Apple的Event-Driven XML Programming Guide以获取更多信息。

请记住,如果要使用同步NSURLConnection,则应在后台线程上执行此操作。