0

我试图步伐迅速变化的表格视图的更新,以显示通过使用performSelector:withObject:afterDelay:日志消息:忽略连续performSelector:withObject:afterDelay:通过检查队列中的消息

  • 第一个新日志消息将在最小延迟(0.5秒)后安排表更新。
  • 在该最小延迟之前的连续日志消息应被忽略。
  • 更新表格视图后,可以再次调度新的更新。

Similar问题通过呼叫第一个cancelPreviousPerformRequestsWithTarget:“重新计划”原始呼叫。

此外,我在想,如果:

  • GCD会是一个更好的(我确信会),如果它会更简单(不知道)。
  • 我是否真的需要最小化刷新间隔,或者如果表视图准备好再次更新(根据设备及其工作负载,0.5秒可能不必要太长或不足够)。

对于感兴趣的人我正在重构this

回答

1

好放弃了performSelector并与是相当不错的一个GCD的解决方案提出了:

创建一个串行队列_consoleQueue = dispatch_queue_create("console_queue", NULL)

消息处理代码_updateScheduled作为忽略后续调用的标志。该标志只在_consoleQueue中读取和修改,以确保一致性。

- (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; 

    // ... 
} 

然而,我仍然不知道如何避免使用_minIntervalToUpdate当表视图“准备好”只是更新。