在原始问题未得到答复后,重新提交更简洁,更有针对性的问题。在另一天的研究之后,还要对问题进行更深入的了解:
在我的应用代理(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秒?
谢谢!
答案 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];
感谢您的时间,
威利。