問題

元の質問が未回答になった後、より簡潔でフォーカスされた質問で再投稿する。また、研究の翌日に問題についてのより多くの洞察を追加する:

私のアプリケーションデリゲート(didFinishLaunching)では、CTCallCentercallEventHandlerを設定しました。 アイデアは、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秒待ちますか?

ありがとう!

  ベストアンサー

コードを次のように変更してみてください。

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

注:

  • パラメータはNSDictionaryではなくNSNotificationです。
  • 私は==と文字列を比較しません
  • ビューをキャストしてhiddenプロパティを変更する必要はありません
  • falseの代わりにNOを使用する

更新:アイデアを得ました:NSLog sの間で次のことを試してください。

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

CTCallCenter docを読むと、すべてのUIが発生するメインキューではない「デフォルトの優先度グローバルディスパッチキュー」にcallEventHandlerが送信されているようです。

  同じタグがついた質問を見る

iphoneobjective-ciosgrand-central-dispatchcore-telephony