我正在使用 XML 文件进行解析。我想显示一个进度条,直到解析过程完成。如何计算 ProgressView 的进度?请帮助..
问问题
1774 次
3 回答
6
首先,计算行数。
NSError *error = nil;
NSString *xmlFileString = [NSString stringWithContentsOfURL:url
encoding:NSUTF8StringEncoding error:&error];
_totalLines = [xmlFileString componentsSeparatedByString:@"\n"].count;
然后,在委托方法块中捕获进度。例如:
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict
{
[self.elementStack addObject:elementName];
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[mainQueue addOperationWithBlock:^{
_progressView.progress = (CGFloat)[parser lineNumber] / (CGFloat)_totalLines;
}];
}
示例项目在这里:
https://github.com/weed/p120727_XMLParseProgress
于 2012-07-27T14:28:05.247 回答
5
如果您正在解析NSXMLParser
并知道正在解析的文件的长度,您可以通过调用lineNumber
解析器对象来估计进度,以告诉您解析器在文件中的距离。
progressView.progress = (CGFloat)[parser lineNumber] / (CGFloat)totalLines;
于 2011-03-25T12:08:55.763 回答
0
我正在处理大文件,需要几秒钟来计算文件中有多少行。
我想出了一个更复杂但更快的解决方案:
- 使用 NSData 将文件的内容映射到虚拟内存中。这是在 OS X 和 iOS 上读取大文件的最快方法。如果是中小型文件,它将被加载到 RAM 中,但大文件只会部分加载到 RAM 中。
- 使用大中央调度,启动后台任务以处理 10KB 块中的数据,计算找到多少换行符。
- 启动另一个大型中央调度任务来解析相同的
NSData
对象。 - 每当启动新标签时,每隔半秒检查一次行数是否已完成,如果已完成,则更新进度条。
将文件映射到虚拟内存然后搜索换行字节比我能找到的任何其他方法快大约 10 倍,包括一些低级 C 选择。在我配备 SSD 的 mac 上计算一个包含 300 万行的文件需要一瞬间。
在后台线程上执行此操作,与NSXMLParser
同一NSData
对象并行,确保文件不会从磁盘读取两次(除非文件太大而无法放入 RAM)。
源代码在这里:https ://github.com/abhibeckert/Speed-Limit/blob/master/Speed%20Limit/SLOSMImporter.m
注意:我发布的代码适用于 iOS 7 和 OS X 10.9。它仅在 OS X 10.9 上进行过测试。它可以很容易地修改以在旧版本的 SDK 上工作,只需构建它,编译错误应该很容易修复。
于 2014-04-03T03:36:55.130 回答