繁体   English   中英

如何让UIProgressView显示从文件(iPhone)加载NSArray的进度?

[英]How to make UIProgressView to show progress of NSArray loading from file (iPhone)?

我希望它甚至可能。

我有应用程序启动后加载真正大文件(字典)的代码:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    NSString *filePath = [NSString stringWithContentsOfFile:[[NSBundle mainBundle]
        pathForResource:@"en_US" ofType:@"txt"]
        encoding:NSUTF8StringEncoding error:nil];
    dictionary = [NSSet setWithArray:[NSArray arrayWithArray:
        [filePath componentsSeparatedByCharactersInSet:
        [NSCharacterSet whitespaceAndNewlineCharacterSet]]]];
}

另外我在viewDidLoad有正确的代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.progressView.progress = 0.0;
    [self performSelectorOnMainThread:
        @selector(applicationDidFinishLaunching:)
        withObject:nil
        waitUntilDone:NO];
}

但我不知道如何强制UIProgressView显示从NSArray创建NSSet dictionary进度。 在iOS模拟器中需要几秒钟,因此在设备上它可能需要十几个。 我真的需要显示进度,我更喜欢这种方式而不是活动指标视图。

我现在对如何计算进口商品感兴趣(已知所有商品的数量)。

任何想法? :)

使用SVProgressHUD 它有showProgress等代表来显示进度。

编辑:

请注意,这只是对方法的建议而非实际实施。 根据您的观察,您可能会或可能不会选择实施它。

如果它是本地文件,您可以对读取整个文件所需的总时间进行一些计算猜测。 然后将此时间除以100。

创建一个异步队列,使用arrayWithContentsOfFiledictionaryWithContentsOfFile或其他方法从文件中读取。 在主线程上实现一个计时器,并通过它递增1,并在主线程上保持发布进度(不要从异步线程中读取进度,因为它永远不会告诉你,我们正在伪造它)。

一旦arrayWithContentsOfFile返回,在主线程上发布100%。 您可能需要调整一点才能准确(例如在Windows中您不断看到文件下载时间波动)但我认为变化不会太大。 每种类型的目标设备都会给出硬件和内存,因此它只是文件大小的函数。

如果要解析长文本文件,框架类将花费很长时间。 你不能改变它。 而你无法改变他们在工作期间永远不会回电话来告诉你他们的进步。

您唯一的机会是自己执行文本文件拆分,并在浏览文本文件时设置进度。 您可以使用正则表达式拆分文本文件。 “\\ w +”收集至少包含一个字符的单词。

如果您在繁重的工作方法中设置进度条,则必须花一些时间来偶尔刷新屏幕。 请参阅下面的“futuredate magic”。

也许以下内容可以作为起点 - 在下面的代码中,文本文件的内容存储在NSString“内容”中。

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression
                              regularExpressionWithPattern:@"\\w+"
                              options:NSRegularExpressionCaseInsensitive
                              error:&error];

[regex enumerateMatchesInString:content
                        options:0
                          range:NSMakeRange(0, [content length])
                     usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
                         // push one match to the dictionary
                         [dictionary addObject:[content substringWithRange:match.range]];

                         // update the progress bar
                         NSDate* futureDate = [NSDate dateWithTimeInterval:0.001 sinceDate:[NSDate date]];
                         [[NSRunLoop currentRunLoop] runUntilDate:futureDate];
                         self.progressbar.progress = (float) match.range.location/content.length;
}];

请注意,代码未针对速度进行优化。 例如,您不应该使用每个令牌更新进度条。 根据您拥有的令牌数量 - 计算检测到的令牌并每100次匹配更新pgogress栏,或者等等......

您需要使用NSURLRequest / NSURLConnection来启动异步请求以获取字典数据。 NSURLConnection的代理将为您提供读取的字节数和剩余字节数,您可以在其中执行异步调度到主线程以更新进度视图值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM