这是我的代码:

- (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");
  }
}

08-26 04:14