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
,而只是在表视图“就绪”时进行更新