1

私はこれを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];
}

ただし、NSLog はすべての中間値を出力しますが、これは UI を 0 から 1 に更新するだけです。ここで誰かが私が間違っていることを知っていますか?

前もって感謝します。

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 に答える