Согласно the answer of this post, вы не должны сбросить dispatch_once_t isn't a good thing to do in any situation other than testing
.Сброс dispatch_once_t?
Скажем, у меня есть раздел кода, который я хочу удостовериться, что он не может быть вызван несколькими потоками за один раз (например, загрузка данных). Это недействительный код:
@interface SomeClass()
{
dispatch_once_t onceToken;
}
@end
- (void) updateMethod
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_once(&onceToken, ^{
// Do some data loading in the background.
...
dispatch_async(dispatch_get_main_queue(), ^{
// Update the UI
...
// Reset the once token. Allow the method to be called again.
onceToken = 0;
});
});
});
}
Есть ли проблемы с этим кодом? Или это должно быть сделано другим путем?
От http://stackoverflow.com/a/19845164/1187415: dispatch_once_t не должен быть переменной экземпляра. –