在CTCallCenter callEventHandler中取消隐藏视图非常慢

时间:2011-06-08 05:40:52

标签: iphone objective-c ios grand-central-dispatch core-telephony

在原始问题未得到答复后,重新提交更简洁,更有针对性的问题。在另一天的研究之后,还要对问题进行更深入的了解:

在我的应用代理(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秒?

谢谢!

4 个答案:

答案 0 :(得分:10)

尝试将代码更改为:

- (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");
   }
}

注意:

  • 参数为NSNotification,而不是NSDictionary
  • 我不会将字符串与==
  • 进行比较
  • 无需转换视图以更改hidden属性
  • 使用NO代替false

更新:明白了:您能否在NSLog之间尝试以下内容?

dispatch_async(dispatch_get_main_queue(), ^{
   [self.view viewWithTag:kNONEMERGENCYCALLSAVEDTOLOG_TAG].hidden = NO;
});

阅读CTCallCenter doc,似乎callEventHandler被调度在“默认优先级全局调度队列”上,这不是发生所有UI事件的主队列。

答案 1 :(得分:0)

您的隐藏代码看起来没有问题。如果我是你,我会在通话结束后将所有代码注释掉,并逐个取消注释以查看问题所在。

答案 2 :(得分:0)

嗯...在更改隐藏属性后尝试调用[yourViewController.view setNeedsDisplay]。或者避免隐藏,使用alpha或addSubview:而删除.FromSuperview方法。

答案 3 :(得分:0)

djibouti33,

当用户点击拨打电话号码的按钮时,你会把这句话听吗?在WillResignActive功能上?

这句话 - > [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ctCallStateDidChange :) name:@“CTCallStateDidChange”object:nil];

感谢您的时间,

威利。