1

我一直试图让这个工作一天,但我仍然失败。安装应用程序时,我想将一些文件从捆绑包中复制到我的应用程序的 Documents 文件夹中,但这会使用户等待很长时间,应用程序显示启动画面。

所以我想我会用 UIProgressView 作为一个子视图创建一个初始 UIAlertView,每次将文件复制到文档文件夹时都会更新它。但是,警报显示并且进度条永远不会更新。我的逻辑是:

  • 将 UIProgressView 和 UIAlertView 设置为我的 ViewController 的实例变量。
  • 在 ViewDidLoad 中,显示警报并设置委托
  • - (void)didPresentAlertView:(UIAlertView *)alertView执行复制文件并更新 UI 的 for 循环中。代码是:

    - (void)didPresentAlertView:(UIAlertView *)alertView{
        NSString *src, *path;
        src = // path to the Bundle folder where the docs are stored //
        NSArray *docs = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:src error:nil];
    
        float total = (float)[docs count];
        float index = 1;
    
        for (NSString *filename in docs){
            path = [src stringByAppendingPathComponent:filename];
            if ([[NSFileManager defaultManager]fileExistsAtPath:path]) {
                ... // Copy files into documents folder
                [self performSelectorOnMainThread:@selector(changeUI:) withObject:[NSNumber numberWithFloat:index/total] waitUntilDone:YES];                
                index++;
            }
        }
    [alertView dismissWithClickedButtonIndex:-1 animated:YES];
    }
    

ChangeUI 的代码是

- (void) changeUI: (NSNumber*)value{
    NSLog(@"change ui %f", value.floatValue);
    [progressBar setProgress:value.floatValue];
}

然而,这只是将 UI 从 0 更新到 1,尽管 NSLog 会打印所有中间值。这里有谁知道我做错了什么?

提前致谢。

4

1 回答 1

2

问题是您的循环位于主线程上,因此 UI 直到最后都没有机会更新。尝试使用 GCD 在后台线程上进行工作:

dispatch_async(DISPATCH_QUEUE_PRIORITY_DEFAULT, ^
    {
        NSString *src, *path;
        src = // path to the Bundle folder where the docs are stored //
        NSArray *docs = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:src error:nil];

        float total = (float)[docs count];
        float index = 1;

        for (NSString *filename in docs){
            path = [src stringByAppendingPathComponent:filename];
            if ([[NSFileManager defaultManager]fileExistsAtPath:path]) {
                ... // Copy files into documents folder
                dispatch_async(dispatch_get_main_queue(), ^{ [self changeUI:[NSNumber numberWithFloat:index/total]]; } );

                index++;
            }
        }
        dispatch_async(dispatch_get_main_queue(), ^{ [alertView dismissWithClickedButtonIndex:-1 animated:YES]; } );
    } );
于 2012-07-16T11:23:22.770 回答