我正在使用coredata(第一次使用)来保存大量的数据(图像,视频路径,HTML文本) 当我使用prdicate fetchRequest 获取数据时NSArray每次内存使用量增加10到15 mb。有时它会越过400-500mb..app减速,但不会崩溃
我想知道,它通常在核心数据库中吗? 是否有任何方法来获取数据而不增加内存使用量。?
如果没有,那么我该如何解决这个问题呢。 如果有人知道原因或任何想法,请分享。
我的代码如下所示
-(void)GetDatafromPrimaryKey:(NSString *)PrimaryKeyTxt EntityName:(NSString *)EntityName {
NSError *error = nil;
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:EntityName inManagedObjectContext: context];
[fetch setEntity:entityDescription];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"primaryKey == %@",PrimaryKeyTxt]];
// [fetch setIncludesPropertyValues:NO];
[fetch setShouldRefreshRefetchedObjects:NO];
chatAry = [context executeFetchRequest:fetch error:&error];
NSLog(@"---> %lu",(unsigned long)chatAry.count);
if (error != nil) {
// Deal with failure
}
else {
}
}
答案 0 :(得分:0)
首先,如果您可以共享用于从Coredata获取数据的代码段,那么找到解决问题的方法确实很有帮助。
问题可能在于应用程序的体系结构。但是,有关更多信息,我想指出当您在Coredata中访问BLOB时Apple提供的2条建议。
如果迭代很多对象,则可能需要使用本地自动释放池块来确保尽快释放临时对象。
如果您不打算使用Core Data的撤消功能,请通过将上下文的撤消管理器设置为nil来减少应用程序的资源需求。这对后台工作线程以及大型导入或批处理操作尤其有用。
使用这些简单的提示,您应该能够减少内存使用量。
希望这有帮助。
答案 1 :(得分:0)
将图像保存到CoreData不是一个好主意。您应该将它们保存到磁盘,并且可能在CoreData中具有路径。更好的是,如果该图像发生变化,您可以使用NSCache。
如果处理大量数据,请使用:
[fetch setLimit:20];
https://developer.apple.com/reference/coredata/nsfetchrequest/1506622-fetchlimit?language=objc
您最有可能在屏幕上显示最多20个元素,那么为什么只需要少量数据就可以获取所有数据?