Iphone iOS-从本地通知启动应用程序时托管对象上下文崩溃

Iphone iOS-从本地通知启动应用程序时托管对象上下文崩溃,iphone,ios,nsmanagedobjectcontext,Iphone,Ios,Nsmanagedobjectcontext,我有一个创建本地通知的应用程序。当应用程序关闭时(即未运行或在后台),从通知启动时会崩溃。我已设法找出哪一行正在使应用程序崩溃(在下面的评论中说明): 我使用以下3个函数获取托管对象上下文、持久存储协调器和托管对象模型: //Explicitly write Core Data accessors - (NSManagedObjectContext *) managedObjectContext { if (managedObjectContext != nil) { return ma

我有一个创建本地通知的应用程序。当应用程序关闭时(即未运行或在后台),从通知启动时会崩溃。我已设法找出哪一行正在使应用程序崩溃(在下面的评论中说明):

我使用以下3个函数获取托管对象上下文、持久存储协调器和托管对象模型:

//Explicitly write Core Data accessors
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
    return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
    managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
    return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];

return managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
                                           stringByAppendingPathComponent: @"<Project Name>.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                              initWithManagedObjectModel:[self managedObjectModel]];
if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                             configuration:nil URL:storeUrl options:nil error:&error]) {
    /*Error for store creation should be handled in here*/
}

return persistentStoreCoordinator;
}

- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
//显式编写核心数据访问器
-(NSManagedObjectContext*)managedObjectContext{
if(managedObjectContext!=nil){
返回managedObjectContext;
}
NSPersistentStoreCoordinator*coordinator=[self-persistentStoreCoordinator];
if(协调器!=nil){
managedObjectContext=[[NSManagedObjectContext alloc]init];
[managedObjectContext setPersistentStoreCoordinator:coordinator];
}
返回managedObjectContext;
}
-(NSManagedObjectModel*)managedObjectModel{
if(managedObjectModel!=nil){
回归模型;
}
managedObjectModel=[[NSManagedObjectModel mergedModelFromBundles:nil]retain];
回归模型;
}
-(NSPersistentStoreCoordinator*)persistentStoreCoordinator{
如果(persistentStoreCoordinator!=nil){
返回persistentStoreCoordinator;
}
NSURL*storeUrl=[NSURL fileURLWithPath:[[self-applicationDocumentsDirectory]
stringByAppendingPathComponent:@“.sqlite”]];
n错误*错误=nil;
persistentStoreCoordinator=[[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[自我管理对象模型]];
如果(![persistentStoreCoordinator添加PersistentStoreWithType:NSSQLiteStoreType
配置:nil URL:storeUrl选项:nil错误:&错误]){
/*应在此处处理创建存储的错误*/
}
返回persistentStoreCoordinator;
}
-(NSString*)应用程序文档目录{
返回[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];
}
如果您能帮助解决这个问题,我们将不胜感激


提前谢谢。

几件事。在显示的内容中,您似乎正在主线程上使用核心数据,如果是这样,则所有交互都必须在此线程上。您应该在某一天更新代码,以使用新的使用块的“perform”API


由于您的localNotif代码现在在启动委托中执行了一些繁重的操作,因此它在一段时间内不会返回,并且iOS可能会杀死您的应用程序。将相同的代码放入发布到主队列的调度块中,它应该可以工作。添加一些断言以确保导航控制器属性也存在。

谢谢您的回答。看来我的问题是谓词!它不喜欢我在where子句中使用“like”。我把它改成了一个=并且它可以工作

你收到错误日志了吗?谢谢你提供的信息!我没有意识到这一点,我会调查的!
//Explicitly write Core Data accessors
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
    return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
    managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
    return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];

return managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
                                           stringByAppendingPathComponent: @"<Project Name>.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                              initWithManagedObjectModel:[self managedObjectModel]];
if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                             configuration:nil URL:storeUrl options:nil error:&error]) {
    /*Error for store creation should be handled in here*/
}

return persistentStoreCoordinator;
}

- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}