块的行为会有所不同,具体取决于调用方法的方式

时间:2012-06-19 19:51:18

标签: ios xcode core-data objective-c-blocks

我有以下代码对数据库进行一些内务管理:

-(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,但不是来自按钮/目标动作。

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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