从数据库中检索数据时遇到性能问题。
现在,我就是这样做的。
+(NSMutableArray *) searchObjectsInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending
{
i3EAppDelegate *appDelegate = (i3EAppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
[request setEntity:entity];
[request setFetchBatchSize:5];
//[request setFetchLimit:10];
[request setReturnsObjectsAsFaults:NO];
// If a predicate was passed, pass it to the query
if(predicate != nil)
{
[request setPredicate:predicate];
}
// If a sort key was passed, use it for sorting.
if(sortKey != nil)
{
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:sortAscending];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
}
NSError *error;
NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
// NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
[request release];
//[context release];
appDelegate = nil;
return [mutableFetchResults autorelease];
}
还有其他方法可以以更快的方式执行相同的操作吗?
如果是这样的话,如果有人可以帮我解决这个问题会很棒。
答案 0 :(得分:1)
问自己几个关于数据要求的问题。
您是否需要立即访问所有结果?如果您一次只需要一个小数字,则只能检索NSManagedObjectID
:
[request setResultType:NSManagedObjectIDResultType];
这将非常快,并为您提供排序列表,但您必须根据需要检索实际数据。
如果您需要更快的数据,则可以检索出现故障NSManagedObject
的
[request setIncludesPropertyValues:NO];
这将提前分配对象,但在您请求之前不会获取实际数据。
或者,您是否需要在提取过程中执行排序,或者如果对象在内存中,您是否可以更快地进行排序?
值得为自己创建一个测试工具并尝试各种选项,以查看哪种选项最适合您的应用。
答案 1 :(得分:1)
有一些问题:
-setReturnsObjectsAsFaults:
。-setFetchBatchSize:
的设置可能没有您期望的效果。如果要限制返回的结果数,请使用-setFetchLimit:
-mutableCopy
个NSArray
结果没有任何价值。我怀疑你是从书上得到的,并建议你不要这样做。