宏中央调度是否具有仅执行调度队列的最新块的任何功能?想象一下这种情况:许多工作项。在每个工作项之后,我们发送一个块来通知用户当前状态。因此,对于每个工作项,都会有一个“刷新 - 块 - 块”。执行其中一个refresh-ui-blocks后,除最后一个之外,该队列的所有其他项都可以被丢弃。可以执行最后一个来刷新UI。
Grand central dispatch是否具有此功能,或者是否存在此问题的默认实现?
答案 0 :(得分:0)
我提出了一个修改后的生产者/消费者解决方案,限制为缓冲区大小为1,如果缓冲区已满,则丢弃所有推送的项目。 在头文件中添加了一个块变量:
void(^_refreshBlock)(void);
在实施中做这样的事情
- (void)doRefresh
{
if (!_refreshBlock)
{
pthread_mutex_lock(&_refreshMutex);
// get a weak self (a strong self will lead to a retain cycle)
__weak MyObject *weakSelf = self;
_refreshBlock = ^(void)
{
[weakSelf privateRefresh];
};
pthread_mutex_unlock(&_refreshMutex);
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC));
dispatch_after(delay,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
if (_refreshBadgeBlock)
{
void(^work)(void) = _refreshBadgeBlock;
_refreshBadgeBlock = nil;
work();
}
});
}
// else : _refreshBadgeBlock already allocated and will run later
}