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

时间:2013-11-21 10:22:26

标签: ios objective-c core-data

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

当应用程序正在运行时,我使用NSManagedObjectContext作为从该文档插入和提取对象的唯一上下文。

我遇到的问题是 - 在保存之前我检查重复项,如果我在等待 10 秒后进行后续插入,则context不会确认已插入({{ 1}}返回0)对象,并允许重复。

如果另一方面我等待它 - 结果是预期的([matches count]返回任何数字都是真的)。​​

代码完整

[matches count]

3 个答案:

答案 0 :(得分:1)

代码看起来像这样:

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];

答案 1 :(得分:0)

我认为您应该致电[context save:&error]将修改保存到商店。 或者添加[request includesPendingChanges:YES]以允许对待处理的未保存更改进行请求。

答案 2 :(得分:0)

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

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

此查询应该非常快,并且根本不会干扰您的插入。考虑将fetchLimit设置为1,但这不是必需的。

NSArray *results = [self.managedObjectContext 
                   executeFetchRequest:request error:nil]; 

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