Cocoa touch 核心数据:NSManagedObjectContext未保存/获取请求失败,直到应用程序退出&;重新启动

Cocoa touch 核心数据:NSManagedObjectContext未保存/获取请求失败,直到应用程序退出&;重新启动,cocoa-touch,core-data,ios6,nsmanagedobjectcontext,Cocoa Touch,Core Data,Ios6,Nsmanagedobjectcontext,我有一个核心数据后端,它表现出一些奇怪的行为。第一次运行我的应用程序(在模拟器中)时,我的NSFetchRequest将永远找不到匹配项,即使在一行中多次给定相同的项(它将返回“no results”(无结果),然后继续将重复信息插入数据库中-我可以看到这种情况发生,因为我有一个绑定到数据库的tableview) 如果我按home按钮“退出”应用程序,然后重新打开应用程序。它开始按预期运行(适当时返回结果)。我还可以删除该应用程序,然后从Xcode再次运行它,以将此过程重置回开始。即使我在NSM

我有一个核心数据后端,它表现出一些奇怪的行为。第一次运行我的应用程序(在模拟器中)时,我的NSFetchRequest将永远找不到匹配项,即使在一行中多次给定相同的项(它将返回“no results”(无结果),然后继续将重复信息插入数据库中-我可以看到这种情况发生,因为我有一个绑定到数据库的tableview)

如果我按home按钮“退出”应用程序,然后重新打开应用程序。它开始按预期运行(适当时返回结果)。我还可以删除该应用程序,然后从Xcode再次运行它,以将此过程重置回开始。即使我在NSManagedObjectContext上调用save(返回true),在应用程序关闭之前它似乎不会保存数据库

这是怎么回事?我怎样才能使这项工作达到预期效果?我想我只是没有保存对NSManagedObjectContext的更改,但我该如何做呢

以下是从NSManagedObjectContext中获取/返回对象的函数: 对于要插入的每个标记,我都这样调用此函数: 以下是我遇到此问题时在日志中看到的内容: -使用新数据库启动应用程序:

2013-05-05 16:45:08.105 ToWatchList[10155:c07] Starting Operation for Key: 731
2013-05-05 16:45:08.106 ToWatchList[10155:c07] Inserting: 731
2013-05-05 16:45:08.111 ToWatchList[10155:c07] Saved is true
2013-05-05 16:45:10.651 ToWatchList[10155:c07] Starting Operation for Key: 731
2013-05-05 16:45:10.652 ToWatchList[10155:c07] Inserting: 731
2013-05-05 16:45:10.654 ToWatchList[10155:c07] Saved is true
-退出并在此处重新启动程序

2013-05-05 16:45:29.816 ToWatchList[10155:c07] Starting Operation for Key: 731
2013-05-05 16:45:29.817 ToWatchList[10155:c07] Found No/Multiple matches for key: 731

-现在,NSFetchRequest按预期返回我之前的两个条目,但当它尝试插入第二个条目时,它应该看到第一个条目。

我猜您的
self.managedObjectContext有一个父上下文。

如果是这种情况,为了确保属性的唯一性,您必须一直保存到存储(递归保存,直到不存在
parentContext
为止)。

请注意,在确保唯一性之前,必须等待所有父上下文上的保存完成

将您的
[上下文保存:&错误]
替换为:

NSManagedObjectContext* c = context;
__block BOOL success = YES;
while (c && success) {
    [c performBlockAndWait:^{
        success = [c save:&error];
        //handle save success/failure
    }];
    c = c.parentContext;
}

我猜您的
self.managedObjectContext
有一个父上下文

如果是这种情况,为了确保属性的唯一性,您必须一直保存到存储(递归保存,直到不存在
parentContext
为止)。

请注意,在确保唯一性之前,必须等待所有父上下文上的保存完成

将您的
[上下文保存:&错误]
替换为:

NSManagedObjectContext* c = context;
__block BOOL success = YES;
while (c && success) {
    [c performBlockAndWait:^{
        success = [c save:&error];
        //handle save success/failure
    }];
    c = c.parentContext;
}

是的,这是我的问题,我认为这与线程有关,但不确定如何解决它。此外,为了避免编译器抱怨,我必须在块内声明并实例化一个新的NSError变量,如下所示:
NSError*blockError=Nil(我也尝试将此作为编辑添加到您的帖子中,但被拒绝:-()不需要额外的
error
对象,只需将您拥有的对象声明为
\uu block NSError*error=nil;
。我很乐意提供帮助是的,我尝试将其设置为nil,它也起了作用……但我宁愿记录错误,以防万一出错。是的,这是我的问题,我想这与线程有关此外,为了避免编译器抱怨,我不得不在块中声明并实例化一个新的NSError变量,如下所示:
NSError*blockError=Nil;
(我也试图将此作为编辑添加到您的帖子中,但被拒绝:-()不需要额外的
error
对象,只需将您拥有的对象声明为
\uu block NSError*error=nil;
。我很乐意提供帮助是的,我尝试将其设置为nil,它也起了作用……但我宁愿记录错误,以防出现问题。
NSManagedObjectContext* c = context;
__block BOOL success = YES;
while (c && success) {
    [c performBlockAndWait:^{
        success = [c save:&error];
        //handle save success/failure
    }];
    c = c.parentContext;
}