0

データベースで少しハウスキーピングを行う次のコードがあります。

-(void)housekeepDataBase{

    NSLog(@"gets called");

    UIView *translucentView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
    translucentView.backgroundColor=[UIColor blackColor];
    translucentView.alpha=0.65;

    UIActivityIndicatorView *spinner=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    spinner.frame=CGRectMake(110, 221.5, 100, 37);
    [translucentView addSubview:spinner];

    [spinner startAnimating];

    [self.view.window addSubview:translucentView];


    dispatch_queue_t fetchQueue = dispatch_queue_create("fetch stuff", NULL);

    dispatch_async(fetchQueue, ^{

        [self deleteBlank];

        [self housekeepHnmr];

        [self housekeepCnmr];

        dispatch_async(dispatch_get_main_queue(), ^{

            [translucentView removeFromSuperview];

            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"house"];
            [[NSUserDefaults standardUserDefaults] synchronize];

            NSLog(@"gets also called");


        });

    });

    dispatch_release(fetchQueue);

}

デバイスでの実行には時間がかかるため (25 秒)、半透明のビューとスピナーを追加して、ユーザーが少し待たなければならないことを認識できるようにします。

問題は、このメソッドがボタンからのターゲット アクションで呼び出された場合、問題なく動作することです。ただし、からメソッドを直接呼び出すとviewDidLoad、データベースは更新されますが、ビューは表示されません。一方、スピナーの作成を内部で実装すると、fetchQueueその逆も機能します。viewDidLoadボタン/ターゲット アクションからではなく、大丈夫です。

私はおそらく、本当に必要のないブロックを使用して、すべて間違っています。実際には、DB の更新中にユーザーが何も触れないようにしたくありません。しかし、私はこれが切り取られていることを発見し、テストで機能したので保持しました。

より適切な方法でそれを行う方法に関する提案はありますか?

ありがとう!

4

1 に答える 1

1

viewDidLoad の代わりに、viewDidAppear を使用します (ただし、一度しか実行されないことを確認してください)。ビューはまだ表示されていないため、viewDidLoad にスピナーを追加することはできません。

于 2012-06-19T19:54:40.320 に答える