1

ユーザーがIOSアプリケーションにデータを入力できるフォームを作成しています。このフォームを使用すると、ユーザーは多くの繰り返しデータを入力できます。そのため、プロセスに時間がかかる場合があり、このプロセス中にUIActivityIndi​​catorViewを表示したいと思います。

残念ながら、スピナーはプロセスの最後に1秒以内に表示され、期待どおりに最初に表示されません。

いくつかのコードがあります:

- (void) manageSpinner{
    spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    [spinner setCenter:CGPointMake(self.view.bounds.size.width/2.0, self.view.bounds.size.height/2.0)]; // I do this becau I'm in landscape mode
    UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.tableView.bounds];
    UIImage *image = [UIImage imageNamed:@"dark_gradiant.jpg"];
    [imageView setImage:image];
    [imageView addSubview:spinner];
    [self.tableView addSubview:imageView];
    [spinner startAnimating];
}


//On click save by the user
- (IBAction)save:(id)sender{

    //Collect information from the form

    myObject.name = nameTF.text;

    [...]

    if(informations OK[...]){        
        //Manage spinner
        [self manageSpinner];

        //Add : this is the long process
        for (int i=0; i<nbRepeatChooseByUser; i++) {
            [myObject register];
        }

        //Call the delegate that will dismiss the form
        [self.delegate theSaveButtonOnTheAddMyObjectTVCWasTapped:self];
    }
}

スピナーはaddingメソッドの前に呼び出されますが、プロセスの後にセットアップされているようです。

ありがとうございました、

アレクサンドル

4

4 に答える 4

2

アクティビティ インジケーターは長いプロセスと同じスレッドで実行されているため、アニメーションはすぐには開始されません。長いプロセスをバックグラウンド スレッドで実行してみてください。

if(informations OK[...]){        
    //Manage spinner
    [self manageSpinner];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        // Do your background process here
        //Add : this is the long process
        for (int i=0; i<nbRepeatChooseByUser; i++) {
            [myObject register];
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            //This section will be called after your long process has been completed.

            //Call the delegate that will dismiss the form
            [self.delegate theSaveButtonOnTheAddMyObjectTVCWasTapped:self];
        });

    });

}
于 2012-11-09T11:07:32.313 に答える
1

これは、TableView が mainThread を使い果たしていると同時に、スピナーを実行する必要があるために発生します。このような場合、コンパイラはアクションをキューに入れます。したがって、スピナーのアニメーションが突然発生します。

アクションを同期するには、スピナーをバックグラウンド スレッドでアニメーション化します。

スピナーを開始および停止するには、次のオプションを実行します

開始: [spinner performSelectorInBackground:@selector(startAnimating) withObject:self]; 停止: [spinner performSelectorInBackground:@selector(stopAnimating) withObject:self];

于 2012-11-09T11:06:02.277 に答える
0

アクティビティ インジケータは、その後にメイン スレッドで実行された操作によってブロックされます。したがって、操作を次のようなバック グラウンド スレッドに変更します。

dispatch_queue_t backgroundQueue;
backgroundQueue = dispatch_queue_create("registerqueue", NULL); 
dispatch_async(backgroundQueue, ^(void) {
        for (int i=0; i<nbRepeatChooseByUser; i++)
        {
            [myObject register];
        }
    });

インポートすることを忘れないでください

#import <dispatch/dispatch.h>
于 2012-11-09T11:09:40.037 に答える
0

UISpinner を管理するための素敵な MIT ライブラリを見つけました: https://github.com/matej/MBProgressHUD

于 2012-11-27T09:25:35.577 に答える