GCD - 块 - 循环中的线程安全变量

时间:2014-07-07 23:11:27

标签: objective-c grand-central-dispatch

GKPlayer玩家在for循环中是否安全?

for (GKPlayer *player in players) {
  [player loadPhotoForSize:GKPhotoSizeSmall withCompletionHandler:^(UIImage *photo, NSError *error) {
    if (!error && photo) {
      if ([player.playerID isEqualToString:[GKLocalPlayer localPlayer].playerID]) {
        currentUser.image = photo;
      } else {
        otherUser.image = photo;
      }
    }
  }];
}

1 个答案:

答案 0 :(得分:1)

是(假设您的代码仅在主线程中执行)

来自Doc

  

调用此方法时,它会创建一个新的后台任务来处理请求。然后该方法将控制权返回给您的游戏。稍后,当任务完成时,Game Kit会调用您的完成处理程序。 总是在主线程上调用完成处理程序。

您的代码仅在主线程中执行,因此没有线程安全问题。


代码的可能执行顺序是这样的

[player1 loadPhotoForSize...];
[player2 loadPhotoForSize...];
[player3 loadPhotoForSize...];

// method return

// photo for player3 downloaded
completionHandlerForPlayer3(photo, error);

// photo for player1 downloaded
completionHandlerForPlayer1(photo, error);

// photo for player1 downloaded
completionHandlerForPlayer2(photo, error);

一切都发生在主线程上,不可能有线程问题。