我正在尝试同步调用Facebook sdk。我知道不建议这样做,但这只是较大的初始化的一部分,该初始化已经在单独的线程上运行,而主线程正在显示“请稍候”屏幕。
我尝试了以下代码:

    NSConditionLock *threadLock = [[NSConditionLock alloc] initWithCondition:101];
    [FBSession openActiveSessionWithReadPermissions:@[@"public_profile"]
                                       allowLoginUI:YES
                                  completionHandler:
     ^(FBSession *session, FBSessionState state, NSError *error) {
         NSLog(@"Completionhandler called");
         [threadLock lock];
         [threadLock unlockWithCondition:100];
     }];
    NSLog(@"Waiting for unlock");
    [threadLock lockWhenCondition:100];
    [threadLock unlock];
    NSLog(@"Unlocked");

这种锁定方法在其他情况下也有效,例如,通过dispatch_async运行线程时。但是,在上面的代码中,从未调用完成处理程序,因此也从未释放过该锁。如果我注释掉所有线程锁行,则会调用完成处理程序。
我不知道如何解释这种行为。有什么建议?

最佳答案

我认为完成处理程序将在同一线程上调用,因此init方法返回并进入线程锁,从而将完成处理程序锁定在该线程上。

10-08 07:46