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 秒),所以我添加了半透明视图和一个微调器,以便用户知道他/她必须稍等片刻。

问题是,如果这个方法是通过一个按钮的 taget 动作调用的,它就可以正常工作。但是,如果我直接从 调用该方法viewDidLoad,则数据库会更新,但视图不会显示。另一方面,如果我在内部实现微调器的创建,fetchQueue反之亦然。可以,viewDidLoad但不能来自按钮/目标操作。

使用我并不真正需要的块,我可能做错了。实际上,我不希望用户在数据库更新期间能够触摸任何东西。但我发现它被剪断了,因为它在测试中有效,所以我保留了它。

有关如何以更适当的方式进行操作的任何建议?

谢谢!

4

1 回答 1

1

使用 viewDidAppear 代替 viewDidLoad(但要确保它只运行一次)。该视图尚未显示,因此您无法在 viewDidLoad 中添加微调器。

于 2012-06-19T19:54:40.320 回答