Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:如何解析XML进行实时搜索_Ios_Xml_Search_Real Time_Nsxmlparser - Fatal编程技术网

iOS:如何解析XML进行实时搜索

iOS:如何解析XML进行实时搜索,ios,xml,search,real-time,nsxmlparser,Ios,Xml,Search,Real Time,Nsxmlparser,现在,我正在解析一个XML文件,就像来自Apple的示例(LazyTableImages)。一切正常。我想添加一个实时搜索(UISearch),它必须解析另一个XML文件(专门为搜索编程)。如何在不冻结屏幕的情况下解析此文件?在后台解析时,使用GCD并分派一个块来完成此操作(可能会显示微调器)。您的XML解析器委托应该看到一个“cancel”标志,因此如果用户执行类似于单击cancel或back按钮的操作,您将立即取消XML解析并允许当前操作停止 编辑:因此您将有一个ivar来保存NSXMLPa

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

在后台解析时,使用GCD并分派一个块来完成此操作(可能会显示微调器)。您的XML解析器委托应该看到一个“cancel”标志,因此如果用户执行类似于单击cancel或back按钮的操作,您将立即取消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];} );
} );
如果用户类型为cancel(假设XML对象很大,解析需要很多秒),那么您只需在action方法中发送

[parser abortParsing];

谢谢你,大卫。我不熟悉GCD。你有一点代码片段吗?