Скажем, у меня есть метод, который запускает загрузку объекта, который может быть вызван из любого потока, но я хочу убедиться, что загрузка уникальна, то есть я не буду запускать другую загрузку того же объекта, если есть уже один.
Лучше ли принудительно выполнять метод в основном потоке, чтобы обеспечить согласованность данных (зная, что загрузка в любом случае будет асинхронной)?
- (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
иваре?
Есть ли разница в сроках исполнения? Какой была бы лучшая стратегия?
@synchronize
в политике, но так или иначе это не должно иметь большого значения. - person Ben Barden   schedule 12.10.2012