Присвоение значений в блоке с помощью GCD - PullRequest
0 голосов
/ 25 мая 2011

Я выполняю поток, который продолжает искать обновления с веб-сайта. Должно быть возможно установить частоту обновления в некоторых видах.

Поток обновлений продолжает проверять обновленный интервал. Но я бы хотел избежать гоночных условий. (Должен ли я беспокоиться об этом с помощью GCD?)

//This variable is used to avoid race conditions, refreshRate is a instance variable
int threadRefreshRate = refreshRate;
BOOL autoRefresh = YES;


dispatch_async(autoUpdateQueue, ^ { 
    while(YES){
        NSLog(@"Runs autoupdate thread");
        dispatch_async(dispatch_get_main_queue(), ^{

            if(autoRefresh){
                [self checkForUpdate];
                //Trying to set thread variable to avoid race condition
                threadRefreshRate = refreshRate;
            }
            else
                NSLog(@"Should not auto refresh");
        });
        sleep(threadRefreshRate);
    }

});

Я пытался реализовать этот код. Однако это не работает для предоставления переменной 'thread' в блоке.

1 Ответ

2 голосов
/ 25 мая 2011

Для того типа кода, который вы дали, я бы использовал события таймера, возникающие в очереди, вместо того, чтобы выполнять явный сон в коде. Таким образом, вам не нужно беспокоиться о состоянии гонки и т. Д.

queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
if (!timer) return;
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), refreshRate * NSEC_PER_SEC, 5 * NSEC_PER_SEC);
dispatch_source_t timer = self.timer;
//initialize self to blockSelf with __block
self.timerAction = ^{
[blockSelf checkForUpdate];
};

dispatch_source_set_event_handler(timer, timerAction);
dispatch_resume(timer);

Если для функции автоматического восстановления установлено значение NO, вы можете отменить его, нажав

dispatch_source_cancel(timer);
...