Macos 在OS X中显示游戏中心排行榜时未在AppKit(主)线程上运行

Macos 在OS X中显示游戏中心排行榜时未在AppKit(主)线程上运行,macos,thread-safety,game-center,game-center-leaderboard,Macos,Thread Safety,Game Center,Game Center Leaderboard,每当我尝试使用以下代码查看游戏中心排行榜ion OS X时: GKGameCenterViewController *gameCenterController = [[GKGameCenterViewController alloc]init]; gameCenterController.gameCenterDelegate = self; if (gameCenterController !=nil) { GKDialogC

每当我尝试使用以下代码查看游戏中心排行榜ion OS X时:

GKGameCenterViewController *gameCenterController 
                             = [[GKGameCenterViewController alloc]init];
gameCenterController.gameCenterDelegate = self;

if (gameCenterController !=nil) {
    GKDialogController *sdc =[GKDialogController sharedDialogController];
    gameCenterController.viewState = GKGameCenterViewControllerStateLeaderboards;
    sdc.parentWindow = [NSApp mainWindow];
    [sdc presentViewController:gameCenterController];

}
(这几乎是苹果公司文档的精确副本)

我得到一个:

***void assertRunningOnAppKitThread(),/SourceCache/ViewBridge/ViewBridge-99/ViewBridgeUtilities.m:535中的断言失败 引发了一个未捕获的异常 未在AppKit(主)线程上运行

通过单击菜单项调用该方法。 我尝试的是将该方法包装在 调度同步(调度获取主队列() 阻挡不成功

编辑:添加堆栈跟踪: -似乎它从主线程(菜单点击)开始,而游戏中心本身开始了一个新的队列


我错过了什么?有什么想法吗?

我想你需要将presentViewController调用(以及之前的那一行)推迟到主线程。请尝试performSelectorOnMainThread或GCD dispatch\u与主队列同步。我已经尝试了dispatch\u sync(dispatch\u get\u main\u queue()-通过包装if语句的内部来进行欺骗。“PerformMonMainThrad”是否有任何区别?游戏控制器本身似乎会切换线程。