Ios 忽略后续性能选择器:withObject:afterDelay:通过检查队列消息
我试图通过使用Ios 忽略后续性能选择器:withObject:afterDelay:通过检查队列消息,ios,objective-c,scheduled-tasks,grand-central-dispatch,performselector,Ios,Objective C,Scheduled Tasks,Grand Central Dispatch,Performselector,我试图通过使用性能选择器:withObject:afterDelay::来调整快速变化的表视图的更新速度,以显示日志消息: 第一条新日志消息将在最小延迟(0.5秒)后安排表更新 应忽略该最小延迟之前的连续日志消息 更新表视图后,可以再次安排新的更新 问题:首先调用cancelPreviousPerformRequestsWithTarget:,以“重新安排”原始通话 我还想知道: GCD会更好(我肯定会),如果它更简单(不确定) 我真的需要最小刷新间隔吗?或者如果表视图准备再次更新,现在是
性能选择器:withObject:afterDelay:
:来调整快速变化的表视图的更新速度,以显示日志消息:
- 第一条新日志消息将在最小延迟(0.5秒)后安排表更新
- 应忽略该最小延迟之前的连续日志消息
- 更新表视图后,可以再次安排新的更新
cancelPreviousPerformRequestsWithTarget:
,以“重新安排”原始通话
我还想知道:
- GCD会更好(我肯定会),如果它更简单(不确定)
- 我真的需要最小刷新间隔吗?或者如果表视图准备再次更新,现在是否有办法(根据设备及其工作负载,0.5秒可能不必要或不够长)
对于感兴趣的人,我正在进行重构。Well放弃了
performSelector
,提出了一个运行良好的GCD解决方案:
创建串行队列\u consoleQueue=dispatch\u queue\u Create(“控制台队列”,NULL)
消息处理代码,\u updateScheduled
用作忽略后续调用的标志。该标志仅在\u控制台equeue
中读取和修改,以确保一致性
- (void)logMessage:(DDLogMessage *)logMessage
{
dispatch_async(_consoleQueue, ^
{
[_newMessagesBuffer insertObject:logMessage
atIndex:0];
// Ignore subsequent calls when already scheduled
if (_updateScheduled)
return;
NSTimeInterval timeToWaitForNextUpdate = _minIntervalToUpdate + _lastUpdate.timeIntervalSinceNow;
if (timeToWaitForNextUpdate > 0)
{
// Start ignoring calls
_updateScheduled = YES;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeToWaitForNextUpdate * NSEC_PER_SEC)), _consoleQueue, ^
{
[self updateTableViewInConsoleQueue];
// Stop ignoring calls
_updateScheduled = NO;
});
}
else
{
[self updateTableViewInConsoleQueue];
}
});
}
- (void)updateTableViewInConsoleQueue
{
_lastUpdate = NSDate.date;
// ...
}
然而,我仍然不知道如何避免使用\u minIntervalToUpdate
,而只是在表视图“就绪”时进行更新