gpt4 book ai didi

ios - 多次调用 NSManagedObjectContextDidSaveNotification

转载 作者:行者123 更新时间:2023-11-29 10:24:23 24 4
gpt4 key购买 nike

您好,我有一个 FriendsViewController,我在其中显示从 coreData 获取的 friend 记录。我有另一个 View Controller AddFriendViewController,它由 FriendsViewController 提供,用于添加新 friend ,并将 Context 保存在其中。我正在收听 FriendsViewController 中共享 MOC 的更改通知。

 [[NSNotificationCenter defaultCenter]
addObserverForName:NSManagedObjectContextDidSaveNotification
object:appdelegate.context queue:nil
usingBlock:^(NSNotification * _Nonnull note) {
NSLog(@"Re-Fetch Whole Friends Array from core data and Sort it with UILocalizedIndexedCollation and reloadData into table");
}];

在 AddFriendsViewController 中创建一个 friend 对象,然后我

Friend *friend= [NSEntityDescription 
insertNewObjectForEntityForName:@"Friend"
inManagedObjectContext:appdelegate.context];
friend.name=nameTextfield.text;
[appdelegate.context save:&error];
[self.navigationController popViewControllerAnimated:YES];

现在,当我从 AddFriendViewController 对上下文执行保存时,FriendsViewController 中的上述 block 被触发几次而不是一次,这会导致更多处理,因为重新获取来自核心数据的全部数据。我不能使用 Fetched Results Controller,因为我正在使用 UILocalizedIndexedCollat​​ion 将我的数组排序到部分中。所以我的问题是为什么它被调用两次甚至三次?还是有其他选择?

最佳答案

只有您知道您希望通知观察者何时激活。

但是,两种常见的范例是:

如果您希望在 View Controller 的生命周期中随时收到通知,那么您可以在 viewDidLoad 中注册观察者,并在 dealloc 中移除观察者。

如果您想在 View 处于事件状态时随时收到通知,请在 viewWillAppear 中注册观察者并在 viewWillDisappear 中删除。

编辑

I used this statement to remove all entries [[NSNotificationCenter defaultCenter]removeObserver:self]; And it was still showing same behaviour. Then I used addObserver: selector: name: object: method which worked. But Why the other one was not removed ? – Asadullah Ali

那是因为您添加了一个基于 block 的观察器,它返回一个观察器对象。您删除它返回给您的对象。您真的应该阅读您使用的每种方法的文档。

如果使用 block-observer 方法,添加/删除将如下所示。

id observer = [[NSNotificationCenter defaultCenter]
addObserverForName:SomeNotification
object:objectBeingObserved
queue:nil
usingBlock:^(NSNotification *note) {
// Do something
}];

[[NSNotificationCenter defaultCenter] removeObserver:observer];

如果您使用 selector-observer 方法,则需要移除您提供给 add 调用的观察者。

[[NSNotificationCenter defaultCenter]
addObserver:someObject
selector:@selector(notificationHandler:)
name:SomeNotification
object:objectBeingObserved];

[[NSNotificationCenter defaultCenter]
removeObserver:someObject
name:SomeNotification
object:objectBeingObserved];

关于ios - 多次调用 NSManagedObjectContextDidSaveNotification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33178811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com