Отображение представления происходит очень медленно в CTCallCenter callEventHandler

Репост с более кратким и конкретным вопросом после того, как исходный вопрос остался без ответа. Также добавление большего понимания проблемы после еще одного дня исследования:

В моем делегате приложения ( didFinishLaunching ) я настроил callEventHandler на CTCallCenter . Идея состоит в том, что при изменении callState я отправляю уведомление с помощью userInfo dict содержащий call.callState . На мой взгляд, я наблюдаю это уведомление, и когда userInfo dict содержит значение CTCallDisconnected , я хочу отобразить представление.

Проблема, с которой я столкнулся, заключается в том, что скрытый аспект почти постоянно занимает ~ 7 секунд . Все остальное работает нормально, и я знаю это, потому что я NSLog до и после раскрытия, и эти журналы появляются немедленно, но чертово представление все еще задерживается на 7 секунд.

Вот мой код:

appDidFinishLaunching:

self.callCenter = [[CTCallCenter alloc] init];
    self.callCenter.callEventHandler = ^(CTCall* call) {
        // anounce that we've had a state change in our call center
        NSDictionary *dict = [NSDictionary dictionaryWithObject:call.callState forKey:@"callState"];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"CTCallStateDidChange" object:self userInfo:dict];
    };

Затем я слушаю это уведомление, когда пользователь нажимает кнопку, которая набирает номер телефона:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ctCallStateDidChange:) name:@"CTCallStateDidChange" object:nil];

Затем в ctCallStateDidChange:

- (void)ctCallStateDidChange:(NSNotification *)notification
{
   NSLog(@"121");
   NSString *callInfo = [[notification userInfo] objectForKey:@"callState"];
   if ([callInfo isEqualToString:CTCallStateDisconnected]) {
      NSLog(@"before show");
      [self.view viewWithTag:kNONEMERGENCYCALLSAVEDTOLOG_TAG].hidden = NO;
      NSLog(@"after show");
   }
}

я отследил проблему до условия if в приведенном выше примере кода:

 if ([[userInfo valueForKey:@"userInfo"] valueForKey:@"callState"] == CTCallStateDisconnected) {

Если я просто заменю это на:

if (1 == 1) {

, то представление появится немедленно!

дело в том, что эти операторы NSLog регистрируются немедленно, но представление отстает в нем. Как это условие могло вызвать только часть его блока? выполнить немедленно, а остальное подождать ~ 7 секунд?

Спасибо!

7
задан tk421 12 March 2018 в 18:23
поделиться