Возможный дубликат:
отображение представление выполняется очень медленно в CTCallCenter callEventHandler
Я застрял на проблеме в течение двух дней. Вчера я спрашивал на SO, но пока не смог найти решение. Я решил сделать репост и попытаться быть более конкретным, так как у меня больше опыта в этом вопросе.
В моем делегате приложения (didFinishLaunching) я настроил callEventHandler на CTCallCenter. Идея состоит в том, что когда callState изменяется, я публикую уведомление с userInfo dict, содержащим call.callState. С моей точки зрения, я наблюдаю это уведомление, и когда словарь userInfo содержит значение CTCallDisconnected, я хочу отобразить представление.
Проблема, с которой я сталкиваюсь, заключается в том, что отображение аспекта занимает почти постоянно ~ 7 секунд. Все остальное работает нормально, и я знаю это, потому что я NSLog до и после показа, и эти журналы появляются сразу, но проклятый вид все равно лагает на 7 секунд.
Вот мой код:
приложениеDidFinishLaunching:
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:(NSDictionary *)userInfo {NSLog(@"121"); if ([[userInfo valueForKey:@"userInfo"] valueForKey:@"callState"] == CTCallStateDisconnected) { NSLog(@"before show"); ((SavedToCallLogView *)[self.view viewWithTag:kNONEMERGENCYCALLSAVEDTOLOG_TAG]).hidden = false; NSLog(@"after show"); }
Я отследил проблему до условия if в приведенном выше примере кода:
if ([[userInfo valueForKey:@"userInfo"] valueForKey:@"callState"] == CTCallStateDisconnected) {
Если я просто заменю это на:
if (1 == 1) {
Тогда вид появляется сразу!
Дело в том, что эти операторы NSLog регистрируются немедленно, но представление отстает в его отображении. Как это условие может привести к тому, что только часть его блока будет выполняться немедленно, а остальная часть будет ждать ~ 7 секунд?
Спасибо!