我正在尝试同步调用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方法返回并进入线程锁,从而将完成处理程序锁定在该线程上。