UIImage aus Core Data laden langsam

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UIImage aus Core Data laden langsam

    Hallo Entwickler,

    In meiner App speichere ich UIImage Objekte als NSData in Core Data. Das Problem ist, das beim Laden durch NSKeyedUnarchiver viel Zeit verloren geht, die der Nutzer als 0,5 sec Ruckler zur Kenntnis nimmt.

    Gibt es eine bessere (und schnellere) Möglichkeit größere UIImages (8 MP) in Core Data zu speichern und effizient zu laden?
  • Bei der Größe wird jede Art der Speicherung und des Ladens langsam.
    Statt Dir um den Speicherort Sorgen zu machen würde ich lieber asynchrones Laden versuchen.
    Dann braucht das zwar immer noch 0.5s zum Laden eines Bildes, dafür ruckelt nix mehr.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • UIImage aus Core Data laden langsam

    Der Nutzer kann Bilder mithilfe eines UIImagePickerController auswählen und sie zu seinen Notizen hinzufügen.

    In StackOverflow wird empfohlen größere Images auf den internen Speicher zu schreiben und nur einen Link an Core Data zu geben. Wenn ich diesen Ansatz wähle, wie bekomme ich dann meine Bilder über alle Geräte synchronisiert?
  • UIImage aus Core Data laden langsam

    MCDan schrieb:

    Mir ist nicht ganz klar, warum Du einen NSKeyedUnarchiver verwendest.

    Hast Du mal probiert die Bilder direkt als NSBinaryDataAttributeType (NSData) abzulegen.


    Ich speichere sie mithilfe von NSKeyedArchiver und NSKeyedUnarchiver in NSData.
  • Du kannst das UIImage auch per UIImagePNGRepresentation() oder UIImageJPEGRepresentation() in NSData wandeln und dieses dann als NSBinaryDataAttributeType (NSData) direkt in CoreData abzulegen.

    Der Rückweg funktioniert dann einfach über imageWithData:

    So sparst Du Dir zumindest schon mal den NSKeyedUnarchiver.
  • MCDan schrieb:

    So sparst Du Dir zumindest schon mal den NSKeyedUnarchiver.

    Allerdings nicht das 8MP Bild. Das können ja unkomprimiert mal locker 17MB werden – pro Bild. Und das dauert. So oder so.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ich verstehe ehrlich gesagt auch nicht was ein 8MPixel Bild in einer Notiz verloren haben sollte. Wenn ich ein Bild in einer Notiz haben möchte, dann als kleine Erinnerungshilfe und da kann das bild auch 320x200 oder so sein und das ist mehr als ausreichend.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    Ich verstehe ehrlich gesagt auch nicht was ein 8MPixel Bild in einer Notiz verloren haben sollte. Wenn ich ein Bild in einer Notiz haben möchte, dann als kleine Erinnerungshilfe und da kann das bild auch 320x200 oder so sein und das ist mehr als ausreichend.


    Das ist nicht wirklich meine Entscheidung, als Nutzer der App würde ich schon erwarten, dass meine Bilder nicht verkleinert werden. Besonders auf dem iPad würde es dann doof aussehen, wenn das Bild in niedriger Auflösung gegeben ist.

    Wie machen es die anderen Apps mit Bildern, die iCloud nutzen?
    Nur so als Idee, würde es funktionieren, wenn man das Bild auf dem lokalen Speicher ablegt und aus diesem lädt, wenn es vorhanden ist? Wenn es nicht vorhanden ist, wird es dann aus Core Data geladen und auf den lokalen Speicher geschrieben. Man bräuchte natürlich noch einen Identifier, um zu wissen, ob ein Bild aktualisiert wurde.
  • Dann hättest Du das Bild ja doppelt, also in Core Data und noch mal auf dem Flash Speicher.

    Versuche doch mal das UIImage per UIImageJPEGRepresentation() in NSData zu wandeln. Mit einer compressionQuality zwischen 0.6 und 0.8 sollte es recht klein werden und weiterhin eine gute Qualität haben.

    Evtl. würde es sich anbieten, von dem Bild ein Thumbnail zu erstellen, welches für die Vorschau verwendet wird. Wählt der Anwender dann das Bild zur Ansicht aus, dann zeigst Du erst das Thumbnail und lädst das original Bild. Sobald dieses geladen ist tauschst Du einfach die Bilder aus. Das Thumbnail kannst Du z.B. in 512 x 384 als JPEG mit 0.2 - 0.3 compressionQuality anlegen. Dies sollte für eine kurze Vorschau reichen, bis das original Bild geladen ist und angezeigt wird. Die Größe und compressionQuality für das Thumbnail kannst Du ja noch optimieren und schauen welche Werte ein gutes Ergebnis liefern.
  • Ich habe es jetzt mit der UIImageJPEGRepresentation() versucht und es läuft schon besser. Zusätzlich komprimiere ich das Image auf max. 2048 Höhe bzw. Breite. So sollte es zumindest auf dem iPad im Vollbild dargestellt werden können und ist nicht die vollen 8MP groß (wenn es ein iPhone 4S+ Foto ist).