Ios 在NSFetchRequest找到新对象之前,CoreData需要一段时间

Ios 在NSFetchRequest找到新对象之前,CoreData需要一段时间,ios,objective-c,core-data,Ios,Objective C,Core Data,我的应用程序中有一个表单,允许用户输入文本并将其保存到UIManagedDocument中的CoreData 当应用程序运行时,我将使用NSManagedObjectContext作为插入和获取此文档中对象的唯一上下文 我遇到的问题是-在保存之前,我检查重复项,如果我在后续插入时等待10秒,上下文不会确认已插入([matches count]返回0)对象,并允许重复项 另一方面,如果我等待一段时间,则结果与预期一致([matches count]返回任何为真的数字) 完整代码 我认为您应该调用[

我的应用程序中有一个表单,允许用户输入文本并将其保存到
UIManagedDocument
中的
CoreData

当应用程序运行时,我将使用
NSManagedObjectContext
作为插入和获取此文档中对象的唯一上下文

我遇到的问题是-在保存之前,我检查重复项,如果我在后续插入时等待10秒,
上下文
不会确认已插入(
[matches count]
返回0)对象,并允许重复项

另一方面,如果我等待一段时间,则结果与预期一致(
[matches count]
返回任何为真的数字)

完整代码
我认为您应该调用
[context save:&error]
将修改保存到存储中。
或者添加
[请求包括发送更改:是]
以允许请求挂起的未保存更改。

代码应如下所示:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"EntityName"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"uniqueID == %@", newID]
[request setPredicate:predicate];
NSError *error = nil; 
NSArray *matches = [context executeFetchRequest:request error:&error];

if([matches count]){
    // update record
    SomeEnt *ent = [matches objectAtIndex:0];
    // ent set properties  
} 
else{
        // add new record
    SomeEnt *ent =  [NSEntityDescription insertNewObjectForEntityForName:@"EntityName" inManagedObjectContext:context];
    // ent set properties 
    // ...
}
NSError *error;
[context save:&error];

您的查询中的某些内容没有意义。您正在按uniqueID排序,但只获取一个ID,那么排序的目的是什么?消除它

此外,在保存之前检查uniqueID也没有意义。您应该在创建新对象之前执行此检查

此查询应该非常快速,并且不会干扰您的插入。还可以考虑将<代码> FETCHOLLITION/CODE >设置为1,但这不是必要的。
NSArray *results = [self.managedObjectContext 
                   executeFetchRequest:request error:nil]; 

EntityName *object;
if (results.count) {
   object = results.lastObject;
}
else {
   object = [NSEntityDescription insertNewObject… ];
}

嗯,这听起来像是在多线程环境中使用相同的上下文“我在等待10秒的情况下进行后续插入”,这是真的吗?因为MOC不是线程安全的,我在主线程上执行所有操作,不管怎样,当使用MOC
performBlock
时,您总是得到与MOC上的线程相同的线程。这是您的确切代码吗?您是否使用实体名称“EntityName”插入并使用实体名称“Student”获取?插入的实体如何以及何时获取唯一ID?您是否也注意到可以将“uniqueID”这样的列设置为CoreData中唯一的列。这实际上会阻止您插入重复项。这不是真正的标记,但您可以在代码中执行,请参见示例:。这些建议似乎都没有任何效果。行为仍然是一样的。它看起来完全一样。好的,没有看到带有谓词的版本,并且您不需要sort它看起来像这样吗?我认为您的代码将
insertNewObjectForEntityForName
放置在错误的位置,因为您将在上下文中添加相同的对象,而与
[匹配计数]
结果无关。我想它应该放在
else
块中。uups sry,应该保存的,我截取了错误的行,我将修复。谢谢你的回答,但是你的版本如何处理这个问题产生了相同的结果。你是否在循环中重复调用这些插入?如果是,请显示循环。如果没有,请更详细地解释您正在做什么以及实际问题是什么。
NSArray *results = [self.managedObjectContext 
                   executeFetchRequest:request error:nil]; 

EntityName *object;
if (results.count) {
   object = results.lastObject;
}
else {
   object = [NSEntityDescription insertNewObject… ];
}