现在我正在解析一个 XML 文件,例如 Apple (LazyTableImages) 中的示例。一切正常。我想添加一个实时搜索(UISearch),它必须解析另一个 XML 文件(专门为搜索编程)。如何在不冻结屏幕的情况下解析此文件?
问问题
686 次
1 回答
2
您在后台解析时使用 GCD 并调度一个块来执行此操作(并且可能显示一个微调器)。您的 XML 解析器委托应该查看“取消”标志,因此如果用户执行诸如点击取消或后退按钮之类的操作,您将立即取消 xml 解析并允许当前操作停止。
编辑:所以你将有一个 ivar 来保存 NSXMLParser,以及你的类中的一个在解析完成时调用的方法:
NSXMLParser *parser;
NSString *searchTerm;
id results; // some mutable collection that the parser stores things into
- (void)parseFinished:(id)result; // result can be an array or dictionary, whatever you want
when the user has entered some text and you want to search:
searchTerm = ....; // set it
parser = [NSXMLParser alloc] init....];
parsedItems = ....
dispatch_async(dispatch_get_global_queue(0,0), ^
{
BOOL ret = [parser parse];
id myResultObject;
if(ret == YES) {
// your delegate methods have populated parsedItems now
search through them using searchTerm
create and fill in myresultObject, some collection/string/number whatever
}
// nil myResultObject means that parser failed
dispatch_async(dispatch_get_main_queue(), ^[self parseFinished:myResultObject];} );
} );
如果用户键入取消(假设 XML 对象很大,并且解析需要几秒钟),那么您将在 action 方法中简单地发送
[parser abortParsing];
于 2012-08-17T22:54:33.483 回答