gpt4 book ai didi

ios - 忽略连续的 performSelector :withObject:afterDelay: by checking for queue messages

转载 作者:行者123 更新时间:2023-11-29 03:04:03 26 4
gpt4 key购买 nike

我正在尝试使用 performSelector:withObject:afterDelay: 来调整快速变化的 TableView 的更新以显示日志消息::

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

Similar通过首先调用 cancelPreviousPerformRequestsWithTarget: 来询问“重新安排”原始通话。

另外我想知道是否:

  • GCD 会更好(我确信会),并且是否会更简单(不确定)。
  • 我真的需要最小刷新间隔吗?或者如果 TableView 已准备好再次更新,现在是否有办法(0.5 秒可能不必要太长或不够,具体取决于设备及其工作负载)。

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

最佳答案

我们放弃了 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 并在 TableView “准备好”时更新。

关于ios - 忽略连续的 performSelector :withObject:afterDelay: by checking for queue messages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22977612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com