我有以下代码对数据库进行一些内务管理:
-(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秒),所以我添加了半透明视图和微调器,以便用户知道他/她必须等待一段时间。
问题是,如果使用来自按钮的taget动作调用此方法,则它可以正常工作。但是,如果我直接从viewDidLoad
调用该方法,则数据库会更新,但视图不会显示。
另一方面,如果我在fetchQueue
内实现微调器的创建,则反之亦然。好的,来自viewDidLoad
,但不是来自按钮/目标动作。
我可能在使用我并不真正需要的块时做错了。实际上我不希望用户在更新数据库期间能够触摸任何内容。但是我发现它被剪断了,因为它在测试中保留了它。
有关如何以更恰当的方式进行此操作的任何建议吗?
谢谢!
答案 0 :(得分:1)
使用viewDidAppear而不是viewDidLoad(但要确保它只运行一次)。视图尚未显示,因此您无法在viewDidLoad中添加微调器。