gpt4 book ai didi

ios - 'NSObjectInaccessibleException' - CoreData 与 TodayViewExtension 共享

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:01:53 26 4
gpt4 key购买 nike

我有点在我的应用程序中实现了一个今天的 View 扩展与 CoreData 共享,我有多个问题(比如当我有三个对象时只显示一个对象)和一个大问题,“由于未捕获的异常‘NSObjectInaccessibleException’而终止应用程序,原因:'CoreData 无法完成'0xd0000000001c0004' 的故障”。现在,只有当我在后台打开应用程序时才会发生这种情况,这让我相信我的应用程序以不良状态离开商店,但实际上不应该发生这种情况。我正在使用 Persistent Stack,外部“库”来管理所有可在 https://gist.github.com/mluisbrown/7015953 上读取的 CoreData(而不是 AppDelegate)

从 TodayView 扩展中获取 CoreData:

-(void)viewDidLoad{

self.persistentStack = [[PersistentStack alloc] initWithStoreURL:self.storeURL modelURL:self.modelURL];
self.managedObjectContext = self.persistentStack.managedObjectContext;
}


- (NSURL*)storeURL
{
//NSURL* documentsDirectory = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:NULL];
// return [documentsDirectory URLByAppendingPathComponent:@"WhatIOwe.sqlite"];
NSURL *directory = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.bittank.io"];
NSURL *storeURL = [directory URLByAppendingPathComponent:@"WhatIOwe.sqlite"];



return storeURL;

}

- (NSURL*)modelURL
{
return [[NSBundle mainBundle] URLForResource:@"WhatIOwe" withExtension:@"momd"];
}





- (NSFetchedResultsController *)fetchedResultsController {

self.persistentStack = [[PersistentStack alloc] initWithStoreURL:self.storeURL modelURL:self.modelURL];

self.managedObjectContext = self.persistentStack.managedObjectContext;


if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"OweInfo" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:@"details.date" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext sectionNameKeyPath:nil
cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;


return _fetchedResultsController;

}

按照建议,我已经在我的持久堆栈中尝试了一个合并策略:

[self.managedObjectContext.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:self.storeURL
options:@{ NSPersistentStoreUbiquitousContentNameKey : @"WhatIOwe",
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES,
NSMergeByPropertyObjectTrumpMergePolicy : @YES}
error:&error];

关于配置我的 NSManagedObjectContext 的另一个观察,通过:

  [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.storeURL options:nil error:&error]; allows the extension to read the store (but still throw the error I'm having), but passing


[psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:self.storeURL options:@{ NSPersistentStoreUbiquitousContentNameKey : @"iCloudStore",
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption : @YES,
} error:&error]; will result in the extension not reading any data whatsoever.

旁注:psc 作为

传递
__weak NSPersistentStoreCoordinator *psc = self.managedObjectContext.persistentStoreCoordinator;
self.persistentStoreCoordinator = self.managedObjectContext.persistentStoreCoordinator;

最佳答案

这里发生的是,您有两个不同的进程访问同一个核心数据存储,每个进程都有自己的 NSPersistentStoreCoordinator

一个进程修改了存储 - 很可能是删除。另一个进程无法知道这个删除发生了,并且在内存中已经有一个对象指向现在删除的数据。当该进程尝试访问该对象时,它必须去商店获取数据(“触发故障”),而该数据已不存在。

Core Data 不是为这种用途而设计的,扩展的功能与应用程序有很大不同。如果您的扩展程序能够写入应用程序可以写入的相同数据,您可以重新考虑您的方法并使扩展程序只能读取数据,并且永远不要将数据长时间保存在内存中。这至少会减轻遇到这些问题的最常见方式。

关于ios - 'NSObjectInaccessibleException' - CoreData 与 TodayViewExtension 共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29056413/

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