#ios #objective-c #multithreading #facebook-ios-sdk
#iOS #objective-c #многопоточность #facebook-ios-sdk
Вопрос:
Я пытаюсь синхронно вызвать 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 . Однако в приведенном выше коде обработчик завершения никогда не вызывается, и поэтому блокировка никогда не снимается. Если я не прокомментирую все строки блокировки потоков, вызывается обработчик завершения.
Я не знаю, как объяснить такое поведение. Есть какие-нибудь предложения?
Ответ №1:
Я думаю, что обработчик завершения будет вызываться в том же потоке, поэтому метод init возвращается и переходит в блокировку потоков, и это блокирует вызов обработчика завершения в этом потоке.