这是我的代码:
- (void)viewDidLoad {
[super viewDidLoad];
[self testGCD];
}
- (void)testGCD {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"1");
return;
});
NSLog(@"2");
}
控制台将打印1 和 2。
我想要的只是第一次打印1。我认为
return
可能不是从方法返回的,而是从代码块返回的。我有什么办法可以从该GCD块中的当前方法返回?
最佳答案
如果您看到dispatch_once
的定义,那么您将看到他们正在使用DISPATCH_EXPECT
来比较onceToken
。您也可以使用if (onceToken != -1)
,但是DISPATCH_EXPECT
通过告诉编译器onceToken == -1
的概率要高得多来优化代码。这称为分支预测
- (void)testGCD {
static dispatch_once_t onceToken;
if (DISPATCH_EXPECT(onceToken, ~0l) != ~0l) {
dispatch_once(&onceToken, ^{
NSLog(@"1");
return;
});
}
else {
NSLog(@"2");
}
}