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

在原始问题没有得到答复之后,转载更加简洁和重点突出的问题。 经过一天的研究之后,还要加深对这个问题的认识:

在我的应用程序委托(didFinishLaunching)中,我在CTCallCenter上设置了一个callEventHandler。 这个想法是,当一个callState改变时,我发布一个包含call.callState的userInfo字典的通知。 在我看来,我观察到这个通知,并且当userInfo字典包含CTCallDisconnected的值时,我想取消隐藏一个视图。

我遇到的问题是,无隐藏的方面几乎一致,约7秒。 其他一切工作正常,我知道这是因为我NSLog之前和之后的解除隐藏,而这些日志立即出现,但恶意的观点仍然滞后7秒。

这是我的代码:

appDidFinishLaunching:

     self.callCenter = [[CTCallCenter alloc] init];
     self.callCenter.callEventHandler = ^(CTCall * call){
         //我们的呼叫中心发生了状态变化
         NSDictionary * dict = [NSDictionary dictionaryWithObject:call.callState forKey:@“callState”];
         [[NSNotificationCenter defaultCenter] postNotificationName:@“CTCallStateDidChange”object:self userInfo:dict];
     };

然后,当用户点击拨打电话号码的button时,我会收听此通知:

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

然后,在ctCallStateDidChange中:

 - (void)ctCallStateDidChange:(NSNotification *)通知
 {
   的NSLog(@ “121”);
    NSString * callInfo = [[通知用户信息] objectForKey:@“callState”];
   如果([callInfo isEqualToString:CTCallStateDisconnected]){
       NSLog(@“before show”);
       [self.view viewWithTag:kNONEMERGENCYCALLSAVEDTOLOG_TAG] .hidden = NO;
       NSLog(@“show show”);
    }
 }

我已经将问题追溯到上述代码示例中的if条件:

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

如果我简单地用:

 if(1 == 1){

然后立即出现!

事情是,这些NSLog语句是立即logging,但视图滞后于它的隐藏。 这种情况怎么会导致只有一部分块立即执行,其余的等待~7秒?

谢谢!

尝试将您的代码更改为:

- (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
  • 我不会比较string==
  • 不需要投影视图来更改hidden属性
  • 使用NO而不是false

更新 :有一个想法:你可以尝试下面,在NSLog之间?

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

读取CTCallCenter文档,看起来callEventHandler是在“默认优先级全局调度队列”上调度的,而不是所有UI事件发生的主要队列。

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

嗯…尝试在更改隐藏属性后调用[yourViewController.view setNeedsDisplay] 。 或者避免隐藏,请使用alpha或addSubview:和removeFromSuperview方法。

djibouti33,

你在哪里放这个句子,当用户点击一个拨打电话号码的button?WillResignActive函数?

这个语句 – > [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ctCallStateDidChange 🙂 name:@“CTCallStateDidChange”object:nil];

谢谢你的时间,

威利。

Interesting Posts