【问题标题】:Core Data fetch request optimizationCore Data 获取请求优化
【发布时间】:2013-02-17 16:40:45
【问题描述】:

我正在开发一个需要检查字符串是否已保存到数据库中的应用程序。这似乎是一个简单的操作,但它需要半秒钟才能返回任何我认为很多的响应。我的问题是是否有任何方法可以减少该时间。感谢您的关注。

这是我当前的代码:

- (BOOL) isDeleted:(int)i {

    NSString *value = [NSString stringWithFormat:@"deleted.*.%i", i];

    MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];

    NSString *entityName = @"Deleted";
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDesc];

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(deletedpics like %@)", value];
    [request setPredicate:pred];

    NSError *error;
    NSArray *objects = [context executeFetchRequest:request error:&error];

    BOOL returnBool = [objects count] >= 1 ? YES : NO;
    return returnBool;

}

【问题讨论】:

  • 您能解释一下实体和关系吗?我不太明白谓词。
  • 不同实体之间没有关系。具体来说,这个实体只包含一个属性,即deletedpics。参考谓词,其想法是检查图片是否已被报告为已删除。我将删除的寄存器组织为“deleted.status(其他操作需要的变量).picturenumber”。在此功能中,我想在不考虑状态的情况下检查某张图片是否已被删除。这就是我使用这个谓词的原因。我希望现在更清楚了。
  • 尝试索引该属性。 @"deleted.*.%i" 是什么意思?

标签: ios objective-c core-data optimization nsfetchrequest


【解决方案1】:

一个优化是替换

NSArray *objects = [context executeFetchRequest:request error:&error];

通过

[request setFetchLimit:1];
NSUInteger count = [context countForFetchRequest:request error:&error];

如果您只想检查对象是否存在。

但我认为主要的性能问题是使用LIKE 进行通配符搜索,这比使用== 搜索要慢。

而不是将状态和图片编号存储在一个 属性为deleted.<status>.<picturenumber>(正如您在评论中所写),在实体中使用单独的属性status 和picturenumber 可能会更好。

然后就可以用谓词搜索图片编号了

[NSPredicate predicateWithFormat:@"picturenumber == %d", i];

应该更快。如有必要,您可以另外索引该属性(如评论中提到的@flexaddicted)。

【讨论】:

  • +1 我没有时间回复,但你的很好。感谢您引用我的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多