Блок похож на совершенно отдельный метод. return
в нем вернется только из блока. То, что вам действительно нужно, кажется:
- (void)testGCD {
static BOOL didTrigger = NO;
if(didTrigger) {
NSLog(@"2");
}
else {
didTrigger = YES;
NSLog(@"1");
}
}
Вы можете попытаться установить простую блокировку в вашем случае, но я не уверен, насколько безопасна в этом случае:
- (void)testGCD {
static dispatch_once_t onceToken;
static BOOL didInvokeOnceBlock = NO;
static BOOL didPassSkippedBlock = NO;
dispatch_once(&onceToken, ^{
NSLog(@"1");
didInvokeOnceBlock = YES;
});
if(didInvokeOnceBlock && didPassSkippedBlock) {
NSLog(@"2");
}
didPassSkippedBlock = YES;
}
Но похоже, что при многопоточности результаты могут быть нестабильными. Возможно, вам придется запустить это атомарно, чтобы результат был правильным. Что я вижу в качестве потенциальной проблемы:
- Поток A и поток B начинают выполнять один и тот же метод.
- Нить А собирает токен и разблокирует
didInvokeOnceBlock
- Тема B пропускает блок и разблокирует
didPassSkippedBlock
, но пропускает NSLog(@"2");
- Нить A вызывает
NSLog(@"2");