0

奇妙な問題があります。でViewController.m、保存が成功した後に通知を投稿し、Seguetoを実行しListViewControllerます。でListViewController.m、オブザーバーを設定しviewDidLoad、処理メソッドを宣言します。

問題は、ハンドラーメソッドが呼び出されても、内部のコードが実行されないことです。なぜですか?

// ViewController.m
if (success) {
    [[NSNotificationCenter defaultCenter] postNotificationName:kAHPlistSavedSuccessfully object:self];
    [self performSegueWithIdentifier:kAHDetailToListSegue sender:self];
}

// ListViewController.m
- (void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(plistSavedSuccessfully:) name:kAHPlistSavedSuccessfully object:nil];
}

- (void)plistSavedSuccessfully:(NSNotification *)notification
{
    NSLog(@"notification %@", notification);
    [self someMethod]; // not called !
}
4

1 に答える 1

1

不具合の可能性があるものをいくつか見つけることができます。

まず、リスト ビュー コントローラーへのセグエを実行する前に通知を投稿するため、リスト ビュー コントローラーが通知のオブザーバーとして自身を追加する前に通知が投稿される可能性があります。(ログステートメントが印刷されているため可能性は低いですが、場合によってはまだ可能です)。

2 つ目は、通知がポストされたキューと同じキューで受信されることです。ポスト通知コードがメイン キューとは別のキューで呼び出される可能性はありますか? someMethodこれは、スレッドセーフではないコードで動作する場合、問題を引き起こす可能性があります。ポスト通知コードが呼び出されたキューを確認し、それがメイン キューで呼び出されていることを確認するか、ハンドラでsomeMethodを使用して呼び出しをメイン キューにディスパッチする必要がありますdispatch_async

于 2013-02-13T23:50:08.047 に答える