UITableView 滚动期间主队列的并发处理

Concurrent processing on main queue during UITableView scroll

我的应用程序中有秒表屏幕。

主标签每100毫秒显示一次通过时间(不断更新)。

就在那个标签下面,在同一个 ViewController 我有一个 UITableView。

每当我滚动 UITableView 时,秒表标签就会停止更新。

我试过如下使用 Grand Central Dispatch,但它不起作用而且我没想到它会起作用,因为它仍然是同一队列上的两个操作 运行。

dispatch_async(dispatch_get_main_queue(),^{
MyTimerObject *t = (MyTimerObject*)notification.object;
    lblMainTimer.text = t.MainTimerStringValue;});

那么我该如何解决这个问题?

这一切都发生在 NSNotification 的 receiveNotification 方法中,这让我想知道在 table 滚动事件期间锁定的是不是 NSNotification 而不是标签更新...

你的秒表是用 NSTimer 还是 CADisplayLink 更新的?与滚动时无法更新相关的问题通常是 运行 循环模式的错误选择。

例如,这将在 table视图滚动时暂停。

NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(handleTimer:) userInfo:nil repeats:TRUE];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

而这不会:

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

最重要的是,不要使用 NSDefaultRunLoopMode,而是使用 NSRunLoopCommonModes,您可能会发现即使滚动 table 视图,它也会继续到 运行。