2016-03-31 4 views
0

Имеет ли центральная диспетчерская функция какие-либо функции для выполнения только самого последнего блока очереди отправки? Представьте себе такие ситуации: есть много рабочие предметы. После каждого рабочего элемента мы отправляем блок для информирования пользователя о текущем статусе. Поэтому для каждого рабочего элемента будет «refresh-ui-block». После выполнения одного из этих блоков refresh-ui все остальные элементы этой очереди могут быть отброшены, за исключением последнего. последний может быть выполнен для обновления пользовательского интерфейса.Выполнять только последний блок очереди

Имеет ли центральная диспетчерская служба эта функция или есть что-то вроде реализации по умолчанию этой проблемы?

ответ

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 
} 
Смежные вопросы