Notifications NSManagedObjectContextObjectsIDChangeNotification在两个不同视图中出现问题

Notifications NSManagedObjectContextObjectsIDChangeNotification在两个不同视图中出现问题,notifications,nsfetchedresultscontroller,multiple-views,Notifications,Nsfetchedresultscontroller,Multiple Views,各位晚上好, 在解释我的问题之前,我应该先给你解释一下我的项目: 我有一个简单的Coredata模型,其中一个实体称为“对话”,另一个实体称为“消息”。基本上,我需要复制iPhone短信应用程序 Conversation{ messages<-->>Message.conversation } Message{ conversation<<-->Conversation.messages } mergeChang

各位晚上好,

在解释我的问题之前,我应该先给你解释一下我的项目:

我有一个简单的Coredata模型,其中一个实体称为“对话”,另一个实体称为“消息”。基本上,我需要复制iPhone短信应用程序

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

Message{  
    conversation<<-->Conversation.messages  
}    
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;  
然而,我的问题如下:
当我在第二个线程中插入新消息并保存上下文时,通知会发送到两个视图,即使没有显示消息VC。它不是我的ConversationVC的属性,所以当它被弹出时,它的值应该是零。(我想)

我的问题是:为什么发送到未显示的视图?我在调试器的任何地方都看不到它的值。我试图将其作为视图的属性,然后在返回到ConversationVC时将其赋值为“nil”,但随后我收到一个SIGBRT错误,表示通知被发送到一个解除分配的变量(这是逻辑的)。
我真的需要它只发送到当前显示的视图。 你知道吗


非常感谢

好的。。。让我问一个问题:视图是否会显示然后隐藏?例如,您是否忘记告诉它停止观察通知?

这可能会帮助一些人:

对于这个问题,我没有忘记调用[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绑定了更改后的数据,就会以某种方式调用委托,并调用这三个方法

我所做的是:

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

这样,如果调用它,消息将被发送到授权的nil,而不是deallocated实例变量。

My ConversationVC是UITableView。单击一行时,将调用didSelectRowAtIndexPath,并按下查看消息vc。返回对话VC时,视图将弹出。。但事实上,在我的观点中,我没有告诉他们停止观察通知。但老实说,我从来没有告诉他们听通知,或者我使用了:-(void)controllerWillChangeContent:(NSFetchedResultsController*)控制器?是的,当您的视图控制器或视图解除分配时,听起来好像您忘记调用-[NSNotificationCenter removeObserver:]。
- (void) viewDidDisappear {
    self.fetchedResultsController = nil; // using the property !
}