Синхронный вызов Facebook IOS sdk

#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 возвращается и переходит в блокировку потоков, и это блокирует вызов обработчика завершения в этом потоке.