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 视图,它也会继续到 运行。
我的应用程序中有秒表屏幕。
主标签每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 视图,它也会继续到 运行。