2017-06-02 49 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個要素,爲什麼取時,你只需要的所有數據少量的呢?