gpt4 book ai didi

ios - Core Data iOS 8 Today Widget 问题

转载 作者:可可西里 更新时间:2023-11-01 05:21:06 25 4
gpt4 key购买 nike

我有一个返回共享实例的 DataManager 类:

+ (DataManager *)sharedInstance;
{
static DataManager *sharedInstance = nil;
static dispatch_once_t pred;

dispatch_once(&pred, ^{
sharedInstance = [[DataManager alloc] init];
});

return sharedInstance;
}

在这里我跟踪我的 managedObjectContext、managedObjectModel、persistentStoreCoordinator。

我还有一个方法,我可以拉出要显示的项目:

- (NSArray *)getItems
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Item"];
return [[self managedObjectContext] executeFetchRequest:fetchRequest error:nil];
}

现在在我的主应用程序中,当我调用此 getItems 然后单独修改项目时,我有一个 View Controller 。因此,例如设置 item.itemName = @"testName";然后调用我的保存方法。

我还有一个 iOS 8,在我的 TodayViewController 中我也调用了 getItems 方法。我有一个 NSNotification,它检测 managedObjectContext 保存。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refetchItems) name:NSManagedObjectContextDidSaveNotification object:[[DataManager sharedInstance] managedObjectContext]];

这些重新获取的项目确实被调用但返回过时的 NSManagedObjects。例如,itemName 没有更改为@"testName"。

我哪里错了?如果您需要查看任何其他代码,请告诉我。

谢谢!

最佳答案

您可以尝试以下方法来刷新特定的 ManagedObject。如果您想刷新 ManagedObject 列表,则循环每个对象并执行命令。

[_managedObjectContext refreshObject:act mergeChanges:YES];

或者对于 iOS 8.3 及以上版本,您可以使用以下方法一次性更新上下文中的所有 ManagedObject,如下所示。

[_managedObjectContext refreshAllObjects];

有点作用,但只对数据UPDATE,对增删数据没有作用。

如果不行,你也可以添加

[_managedObjectContext reset];

之后,您必须读取“重新分配”您从核心数据存储加载的所有变量。

另一种解决方案(更慢更难看)

如果上述方法不起作用,另一种解决方案是删除当前上下文并重新创建它。

我刚刚设置

_persistentStoreCoordinator = nil;
_managedObjectModel = nil;
_managedObjectContext = nil;

我有具有此属性的 CoreDataManager 类

@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

在类里面,我手动创建了 setter。如果我 nill 所有变量,由于 setter ,一旦我在我的核心数据管理器类之外读取它们,它们就会再次初始化。

您可以通过使用 NSUserDefault 存储来改进这一点。它正在正确更新。在主应用程序中,如果您更改某些内容,请在 NSUserDefault 中设置标志。在扩展中,阅读此内容,如果标记了标志,则重置核心数据。这样,您将节省一些时间并使事情变得更快。

对于 NSUserDefault 的分配(在两个应用程序中 - 扩展和主要)使用这个 - 之后,你可以像往常一样从它读取数据并且它们应该是同步的

NSUserDefaults *prefs = [[NSUserDefaults alloc] initWithSuiteName:GROUP_NAME]; //share with extension

关于ios - Core Data iOS 8 Today Widget 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924223/

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