等到UI更新后再删除UIActivityIndi​​cator

时间:2012-12-10 20:55:43

标签: objective-c ios grand-central-dispatch uiactivityindicatorview

我正在开发的iPad应用程序存在问题。我有以下代码:

CFTimeInterval startTime = CFAbsoluteTimeGetCurrent();

[self showSpinnerWithMessage:@"Loading settings..."]; // Shows a UIActivityIndicator on screen

dispatch_async(dispatch_get_global_queue(0, 0), ^
{
    //Updating items on screen here
    [label1 setText:@"Test1"];
    [label2 setText:@"Test3"];
    //...

    CFTimeInterval difference = CFAbsoluteTimeGetCurrent() - startTime;

    if (difference < MINIMUM_INDICATOR_SECONDS)
    {
        [NSThread sleepForTimeInterval:MINIMUM_INDICATOR_SECONDS - difference];
    }

    dispatch_async(dispatch_get_main_queue(), ^(void)
    {
        [self removeSpinner]; // Removes UIActivityIndicator from screen
    });
};

问题在于,有时UI需要一段时间才能更新,并且在这些特定实例中,微调器(UIActivityIndi​​cator)在UI实际更新之前就消失了。我意识到这是因为屏幕上的项目实际上没有更新,直到下一个运行循环,所以我的问题是,如何让我的[self removeSpinner]调用等待UI更新?

2 个答案:

答案 0 :(得分:2)

尝试将UI更新代码放入removeSpinner的块中。

dispatch_async(dispatch_get_main_queue(), ^(void)
{
    [label1 setText:@"Test1"];
    [label2 setText:@"Test3"];
    [self removeSpinner]; // Removes UIActivityIndicator from screen
});

答案 1 :(得分:0)

[self.view setNeedsDisplay];放在[self removeSpinner]

之前