1

皆さん、こんばんわ、

私の問題を説明する前に、まず私のプロジェクトについて説明する必要があります。

「会話」と呼ばれるエンティティと「メッセージ」と呼ばれるエンティティを持つ単純なCoredataモデルがあります。基本的に、私はiPhoneのSMSアプリケーションを再現する必要があります。

Conversation{  
    messages<-->>Message.conversation  
}  

Message{  
    conversation<<-->Conversation.messages  
}    

ご覧のとおり、私のモデルはわかりやすいです。数週間前に、これらのビューを完全に実装する方法(つまり、この投稿の特定の会話からのメッセージを表示するビューでNSFe​​tchedResultsController(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エラーが発生します。
現在表示されているビューにのみ送信する必要があります。何か考えはありますか?

どうもありがとうございます

4

2 に答える 2

2

わかりました...1つの質問をさせてください:ビューが表示されてから非表示になりますか?つまり、通知の監視を停止するように指示するのを忘れましたか?

于 2011-05-10T18:30:55.150 に答える
1

これは一部の人々を助けるかもしれません:

その問題については、[NSNotificationCenter removeObserver:]を呼び出すことを忘れませんでした。これは、私が話していたメソッドがどこにあるかを示しているためです。

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller;
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath;
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller;  

これらのメソッドは、NSFetchedResultsControllerDelegateに属しています。基本的に、CoreDataに変更が加えられ、NSFetchedResultsControllerが変更されたデータにバインドするたびに、デリゲートが何らかの方法で呼び出され、これら3つのメソッドが呼び出されます。

私がしたことは:

- (void) viewDidDisappear {
    self.fetchedResultsController = nil; // using the property !
}

このように、呼び出された場合、メッセージは、割り当て解除されたインスタンス変数ではなく、許可されたnilに送信されます。

于 2011-10-17T05:23:05.967 に答える