查看不更新,但主线程上的所有内容

时间:2010-10-07 07:13:14

标签: iphone objective-c uikit ios4

我试图在某些用户交互后在表视图上显示UIProgressView。在我的表格视图中,如果用户点击一个特定单元格,我会向上滑动一个UIView,其中包含一个带有条形项和拾取器视图的工具栏(它非常像一个操作表)。当我这样做时,我将屏幕外的视图添加到当前视图,然后为幻灯片添加动画。当用户进行选择并点击“完成”时,视图将滑出。此时,进度视图应该出现并更新,因为有些事情正在后台发生。

我遇到的问题是,在“警报表”UIView滑出当前视图之后,UI中没有任何事情发生。当我显示滑动视图时,我这样做:

[[[UIApplication sharedApploication] keyWindow] addSubview:slidingView];
CGRect newFrame = CGRectMake(...);
[UIView animateWithDuration:0.3
    animations:^{
        slidingView.frame = newFrame;
    }];

当用户在滑动视图中点击“完成”按钮时,将调用此操作方法:

- (void) done {
    NSNumber *row = GetSelectedRowSomehow();

    [self dismiss:@selector(doneCallback:) withObject:row];
}

- (void) dismiss:(SEL)cb withObject:(id)obj {
    [UIView animateWithDuration:0.3
        animations:^{
            slidingView.frame = CGRectMake(...);
        }
        completion:^(BOOL finished) {
            [self.delegate performSelectorOnMainThread:cb
                                            withObject:obj
                                         waitUntilDone:NO];
            [slidingView performSelectorOnMainThread:@selector(removeFromSuperview:)
                                          withObject:nil
                                       waitUntilDone:NO];
        }];
}

这里调用的回调:

- (void) doneCallback {
    self.dialogView.hidden = NO;
    self.progressView.progress = 0;

    for (float i = 0; i < 1.0; i += 0.1) {
        self.progressView.progress += i;
        sleep(0.5);
    }
}

就我而言,dialogView直到callback完成后才会显示。为什么在hidden属性设置为NO后立即更新显示?

1 个答案:

答案 0 :(得分:2)

一旦代码完成执行,显示就会在主线程中更新,所以通过阻止主线程来防止发生这种情况。

其中一个原因是更新是一起批处理的,因此可以有效地重新绘制。

一个解决方案/解决方法是在hidden = NO之后使用performSelector:afterDelay:0.01到doneCallback,将以下代码移动到延迟后运行的新选择器。

或者你可以在“doneCallback”中运行代码作为后台操作(虽然你不能直接从后台线程更新UIKit,所以你必须向主线程发送消息以进行任何显示更新。)