仅执行最后一个队列块

时间:2016-03-31 06:19:19

标签: objective-c grand-central-dispatch

宏中央调度是否具有仅执行调度队列的最新块的任何功能?想象一下这种情况:许多工作项。在每个工作项之后,我们发送一个块来通知用户当前状态。因此,对于每个工作项,都会有一个“刷新 - 块 - 块”。执行其中一个refresh-ui-blocks后,除最后一个之外,该队列的所有其他项都可以被丢弃。可以执行最后一个来刷新UI。

Grand central dispatch是否具有此功能,或者是否存在此问题的默认实现?

1 个答案:

答案 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
}