2017-06-02 16 views
0

我正在使用coredata(第一次使用)保存大量的数据(图像,视频路径,html文本) 当我使用prdicate提取数据fetchRequest NSArray内存使用增加10到15MB每次。有时它会跨越400-500mb..app减慢速度,但不会崩溃coredata数据提取增加内存使用ios

我想知道,它通常在核心数据库中吗? 是否有任何方法来获取数据而不增加内存使用量?

如果不是那么我该如何解决这个问题。 如果有人知道原因或任何想法请分享。

memory usage image

我的代码如下所示

-(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 { 
} 
} 
+1

您应该将图像和视频保存在应用程序目录中而不是核心数据中,并将该图像视频的路径URL保存在核心数据中......其他方式将大量图像和视频保存在核心数据中会消耗更多内存,内存中的图像和视频一次将其保存到核心数据 –

+0

@Sharma sir,我之前使用过DocumentsDirectory ..但结果相同。内存增加:( –

+0

使用'sqlite'是推荐的方式来处理应用程序内的大量数据,它也是最喜欢的方式。 – vaibhav

回答

0

要开始使用它将会真正有助于找到一个解决一个问题,如果你能段,您正在使用,以获取来自Coredata数据共享代码。

该问题可能与应用程序的体系结构有关。但想了解更多信息,我想指出Apple在Coredata中访问BLOB时给出的两条建议。

如果您迭代了很多对象,则可能需要使用本地自动释放池块来确保尽可能快地释放临时对象。

如果您不打算使用Core Data的撤消功能,请通过将上下文的撤消管理器设置为零来降低应用程序的资源需求。这对后台工作者线程以及大量进口或批量操作可能特别有利。

使用这些简单的技巧,你应该能够减少内存使用量。

欲了解更多信息,请参阅:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Performance.html#//apple_ref/doc/uid/TP40001075-CH25-SW11

希望这有助于。

+0

Sir爵士..我已经添加了我的代码问题请看看,我没有使用过“上下文的撤消管理器”。你在说这个 - > https://stackoverflow.com/a/10746031/4970453 –

0

将图像保存到CoreData中并不是一个好主意。您应该将它们保存到磁盘,并可能在CoreData中有路径。更好的是,如果图像会改变,你可以使用NSCache。

如果你处理大量的数据,使用方法:

[fetch setLimit:20]; 

https://developer.apple.com/reference/coredata/nsfetchrequest/1506622-fetchlimit?language=objc

你很可能会在屏幕上显示最多20个要素,为什么取时,你只需要的所有数据少量的呢?