2017-06-02 4 views
0

i Coredata (zum ersten Mal verwendet wird) verwenden für das Speichern von großen amout von Daten (Bilder, Video Pfaden, HTML Text) wenn ich Daten am Holen mit prdicate fetchRequest NSArray Speichernutzung erhöht 10 zu 15 mb jedes Mal. Manchmal wird es überqueren 400-500mb..app verlangsamen, aber nicht abgestürztCoredata Datenabruf erhöht Speicher ios verwendet

ich möchte wissen, ist es normalerweise in der Kerndatenbank? gibt es eine Methode zum Abrufen von Daten ohne Erhöhung der Speichernutzung.?

wenn nicht dann wie kann ich dieses Problem lösen. Wenn jemand den Grund oder eine Idee kennt, bitte teilen.

memory usage image

Mein Code ist unten

gezeigt
-(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

Sie sollten Bild und Videos im Anwendungsverzeichnis anstelle von Kerndaten speichern und Pfad-URL dieses Bild Videos in Kerndaten speichern ... andere weise Speichern einer großen Menge von Bildern und Videos in Kerndaten wird mehr Speicher verbrauchen als es insgesamt Bild und Video im Speicher einmal, um es zu Kerndaten zu speichern –

+0

@Sharma Herr, ich habe DocumentsDirectory vorher..aber das Ergebnis ist gleich. Speicher erhöht :( –

+0

mit 'sqlite' ist ein empfohlener Weg, um große Datenmengen innerhalb der App zu handhaben und es ist am meisten bevorzugt Weg auch. – vaibhav

Antwort

0

Zunächst es wirklich eine Lösung für ein Problem zu finden, würde helfen, wenn Sie den Code teilen können Schnipsel Sie verwenden Daten von Coredata zu holen .

Das Problem kann mit der Architektur der App sein. Für weitere Informationen möchte ich jedoch auf 2 Empfehlungen von Apple hinweisen, wenn Sie innerhalb von Coredata auf BLOB zugreifen.

Wenn Sie über viele Objekte iterieren, müssen Sie möglicherweise lokale Autorelease-Poolblöcke verwenden, um sicherzustellen, dass temporäre Objekte so schnell wie möglich freigegeben werden.

Wenn Sie die Funktion zum Rückgängigmachen von Kerndaten nicht verwenden möchten, reduzieren Sie die Ressourcenanforderungen Ihrer Anwendung, indem Sie den Rückgängig-Manager des Kontexts auf Null setzen. Dies kann insbesondere für Hintergrund-Worker-Threads sowie für große Import- oder Batch-Operationen von Vorteil sein.

Mit diesen einfachen Tipps sollten Sie in der Lage sein, die Speichernutzung zu reduzieren.

Für weitere Informationen siehe auch: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Performance.html#//apple_ref/doc/uid/TP40001075-CH25-SW11

Hoffnung, das hilft.

+0

Sir ji .. ich habe meinen Code in Frage bitte einen Blick und ich habe nicht "Kontext undo Manager" vor. Sprechen Sie darüber -> https://stackoverflow.com/a/10746031/4970453 –

0

Es ist keine gute Idee, Bilder in CoreData zu speichern. Sie sollten sie auf dem Datenträger speichern und haben möglicherweise den Pfad in CoreData. Besser noch, Sie könnten NSCache verwenden, wenn sich dieses Bild ändert.

Wenn Sie mit großen Datenmengen umgehen, verwenden:

[fetch setLimit:20]; 

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

Sie werden wahrscheinlich maximal 20 Elemente auf einem Bildschirm angezeigt werden, warum also alle Daten holen, wenn Sie nur brauchen eine kleine Menge davon?