皆さん、こんばんわ、
私の問題を説明する前に、まず私のプロジェクトについて説明する必要があります。
「会話」と呼ばれるエンティティと「メッセージ」と呼ばれるエンティティを持つ単純なCoredataモデルがあります。基本的に、私はiPhoneのSMSアプリケーションを再現する必要があります。
Conversation{
messages<-->>Message.conversation
}
Message{
conversation<<-->Conversation.messages
}
ご覧のとおり、私のモデルはわかりやすいです。数週間前に、これらのビューを完全に実装する方法(つまり、この投稿の特定の会話からのメッセージを表示するビューでNSFetchedResultsController(FRC)を使用するかどうか)について助けを求めました。
つまり、私が行ったのは、各ビューで1つのFRCを使用することです。別のスレッドは時々私のモデルを更新しています。モデルが変更されたことをビューに通知するために、2番目のスレッドでこれを使用しました。
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:_context];
そしてmergeChanges:関数はこれを行っています:
- (void)mergeChanges:(NSNotification *)notification {
AppDelegate *appDel = (AppDelegate*)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *mainContext = [appDel managedObjectContext];
// Merge changes into the main context on the main thread
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];
}
このコードは、viewController(ConversationVC(すべての会話が一覧表示される)とMessageVC(特定の会話からのすべてのメッセージが一覧表示される))の両方で使用したため、うまく機能していると思いました。
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller;
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath;
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller;
ただし、私の問題は次のとおり
です。2番目のスレッドに新しいメッセージを挿入してコンテキストを保存すると、MessageVCが表示されていなくても、通知が両方のビューに送信されます。これは私のConversationVCのプロパティではないので、ポップされたときの値はnilである必要があります。(おもう)。
私の質問は:なぜこれが表示されていないビューに送信されるのですか?デバッガーではどこにもその値がわかりません。ビューのプロパティにしようとした後、ConversationVCに戻ったときに「nil」を割り当てましたが、割り当て解除された変数(論理的)に通知が送信されたことを示すSIGBRTエラーが発生します。
現在表示されているビューにのみ送信する必要があります。何か考えはありますか?
どうもありがとうございます