Что лучше: форсировать действия в основном потоке или использовать синхронизацию?

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

Лучше ли принудительно выполнять метод в основном потоке, чтобы обеспечить согласованность данных (зная, что загрузка в любом случае будет асинхронной)?

- (void)download
{
    dispatch_async(dispatch_get_main_queue(), ^{
        if (isDownloading == NO) {
            // Some preparation
            isDownloading = YES;
            // Launch asynchronous download
        }
    });
}

или использовать блокирующий механизм синхронизации?

- (void)download
{
    @synchronize(self) {
        if (isDownloading == NO) {
            // Some preparation
            isDownloading = YES;
            // Launch asynchronous download
        }
    });
}

или использовать операцию типа OSAtomicCompareAndSwap на isDownloading иваре?

Есть ли разница в сроках исполнения? Какой была бы лучшая стратегия?


person Guillaume    schedule 12.10.2012    source источник
comment
Я удалил свой ответ. Как вы указали, я был неправ (я неправильно понял несколько вещей). Единственная реальная разница между этими двумя вариантами заключается в том, что если ваш основной поток блокирует что-то, это создаст дополнительный источник замедления. Я бы выбрал версию @synchronize в политике, но так или иначе это не должно иметь большого значения.   -  person Ben Barden    schedule 12.10.2012