0

现在我正在解析一个 XML 文件,例如 Apple (LazyTableImages) 中的示例。一切正常。我想添加一个实时搜索(UISearch),它必须解析另一个 XML 文件(专门为搜索编程)。如何在不冻结屏幕的情况下解析此文件?

4

1 回答 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 回答