データベースで少しハウスキーピングを行う次のコードがあります。
-(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 の更新中にユーザーが何も触れないようにしたくありません。しかし、私はこれが切り取られていることを発見し、テストで機能したので保持しました。
より適切な方法でそれを行う方法に関する提案はありますか?
ありがとう!