2010-12-28 5 views
3

Ich entwickle eine App, mit der der Benutzer Videos und Fotos aufnehmen kann. Jetzt frage ich mich, was ist der beste Weg, sie zu speichern?Speichern von Fotos und Videos in Core Data?

Die erste Idee ist natürlich, es in der Fotobibliothek des Benutzers zu speichern, als ob er das Foto von der Kamera-App aufgenommen und einen Verweis auf die Dateien verwendet hätte. Jetzt gibt es das Problem, dass der Benutzer auf Dateien aus der Anwendung "Fotos" zugreifen und diese löschen kann, die möglicherweise noch von meiner App benötigt werden. Ich glaube nicht, dass ich verhindern kann, dass der Nutzer Fotos löscht, aber wie gehe ich mit der Inkonsistenz meiner App um?
Der andere Weg wäre, mich selbst um die Lagerung zu kümmern. Meine App verwendet bereits Core Data, sodass ich die Mediendateien mit einem NSValueTransformer in ein NSData Objekt konvertieren und als BLOB in Core Data speichern kann. Dann gibt es noch einige Fragen bezüglich der Leistung. Ich weiß, dass ein SQLite-basiertes Core Data Datenbanken von mehreren GB Größe perfekt verarbeiten kann, aber das Laden großer Datenobjekte wird sowieso einige Zeit dauern. Der offensichtliche Vorteil ist, dass der Nutzer meine App nicht inkonsistent macht, aber ist die Leistung akzeptabel? Und vor allem: Wenn ich ein UIImagePickerController verwende, um Fotos und Videos aufzunehmen, wird es trotzdem in der Bibliothek gespeichert. Um es in Core Data zu speichern, müsste ich das Foto von dort nehmen, es in ein NSData Objekt umwandeln, es speichern und es wieder aus der Bibliothek löschen. Dies scheint nicht der richtige Weg zu mir zu sein. UIKit bietet mir auch eine Funktion, um ein NSData Objekt von einem Foto über UIImageJPEGRepresentation() zu bekommen, aber es scheint keine solche Funktion zum Konvertieren von Videos zu geben.

Alles in allem, wegen all dieser unbeantworteten Fragen möchte ich den ersten Ansatz verwenden. Aber das Inkonsistenzproblem verwirrt mich. Was ist die beste Vorgehensweise, um damit umzugehen?

+0

Siehe meine Antwort in: http://stackoverflow.com/questions/10222632/can-access-the-files-user-for-external-binary-storage-in-core-data/13497992#13497992 I kam mit einer "kreativen" Lösung (ob es Best Practice ist anyones rate), aber es wird Ihnen erlauben, Core-Daten zu verwenden, um Ihre Dateien zu verwalten, während immer noch in der Lage, Zugriff auf die ** REAL ** -Dateien über ihren Pfad. –

Antwort

9

Für das Foto:

UIImagePickerController wird uns in den Speicher ein UIImage zurückkehren, so dass Sie nichts zu tun haben würde, es nicht aus der Fotobibliothek des Benutzers und speichern Sie sie in Ihre Kerndaten unter ...

Für das Video: Sie die Daten aus mit NSData *data = [NSData dataWithContentsOfFile:] oder [NSData dataWithContentsOfUrl:] nehmen können das NSData Objekt des Videos zu erhalten. Sie können die videoUrl leicht

So habe ich nur einige Ihrer falschen Annahmen zuerst korrigiert.

Sie müssen es nicht direkt in CoreData speichern. Sie können sie im Dokumentenordner Ihrer Anwendung speichern und dann können Benutzer sie nicht löschen. Wenn Sie im Dokumentordner der Anwendung speichern und nur die Verknüpfung zu CoreData speichern, können Sie auch große Datenobjekte nicht verarbeiten.

Das Problem kann sein, dass Sie mit Ihrem Dateispeicher umgehen müssen.

Ich glaube nicht, dass es hier eine Best Practice gibt.

Speichern im Foto des Benutzers Bibliothek hilft den Benutzern, ihre Fotos und Videos einfacher ohne Ihre App den Zugriff auf

Speichern in Coredata für Sie sein kann einfacher und kann schneller einige Zeit

Speichern in Dateispeicher kann Ihnen helfen, nicht mit einigen binären Problem zu tun, wenn das Video Laden weil Apple MPMoviePlayerController Ihnen helfen kann Für mich

, weil ich nicht viel SQLite und Core Data verwenden Sie, wähle ich in Dateisystem speichern

1

Verwenden Sie Codedaten zum Speichern von Bildern und großen Dateien.

Code-Daten können automatisch binäre Daten für Sie auf Festplatte speichern, setzen Sie einfach diese Option auf die Eigenschaften des Attributs, müssen Sie nur die Option aktivieren, externen Speicher zu erlauben und Core Data wird die Magie für Sie tun, einfach Das.

enter image description here

Hier sind Sie die Funktion in swift3

//Image 
let imageData = UIImageJPEGRepresentation(image, 1) // You can low compression up to >0 

//Video from URL 
let videoData = NSData(contentsOf:videoURL!) 

Es ist so einfach zu tun! iOs süße Programmierung.

Verwandte Themen