我有以下代码对数据库进行一些整理:
-(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
但不能来自按钮/目标操作。
使用我并不真正需要的块,我可能做错了。实际上,我不希望用户在数据库更新期间能够触摸任何东西。但我发现它被剪断了,因为它在测试中有效,所以我保留了它。
有关如何以更适当的方式进行操作的任何建议?
谢谢!