2017-01-09 6 views
0

In meiner App speichere ich ein Bild im lokalen Speicher und speichere den Pfad dieses Bildes in meiner Realm-Datenbank. Und jetzt habe ich Probleme mit dem Laden dieses Bildes von diesem Pfad?Probleme beim Laden des Bildpfads aus dem Realm in Swift

Das ist, wie ich Pfad zur Datenbank speichern:

let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory 
let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask 
let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory,nsUserDomainMask, true) 
let dirPath = paths.first 


    let imageURL1 = URL(fileURLWithPath: dirPath!).appendingPathComponent("refuge1.jpg") 

    let med1 = Meditation() 
    med1.name = "Refuge" 
    med1.count = 0 
    med1.targetAmount = 111111 
    med1.malasStep = 108 
    med1.imagePath = imageURL1.path 
    med1.id = 1 

Es ist einfach, dass ein Bild von diesem meditation.imagePath Pfad zu bekommen versuchen. Ich habe den Pfad doppelt überprüft, Bild ist immer noch nicht in der Lage, das Bild mit diesem Pfad zu setzen, gibt es etwas, das fehlt?

Im Debug-Modus sehe ich:

Meditation { 
name = Refuge; 
count = 0; 
targetAmount = 111111; 
malasStep = 108; 
imagePath = /Users/macbook/Library/Developer/CoreSimulator/Devices/2E25309F-D6A9-41C3-9EF4-67203142172C/data/Containers/Data/Application/F198640B-3C72-4F9C-8173-FB00D3ABEC15/Documents/refuge1.jpg; 
id = 1;} 

aber meine variable Bild nil noch im Debug-Modus

// Configure the cell... 
    cell.nameOfMeditation.text = meditation.name 
    cell.countOfMeditation.text = String(meditation.count) 
    let image = UIImage(contentsOfFile: meditation.imagePath) 
    cell.imageForMeditation.image = image 

    return cell 

Ich sehe Namen der Meditation und Klang, bot keine omg.

Antwort

0

Try this:

// Use these convenience methods if you do a lot of saving and loading 
func getDocumentsURL() -> URL { 
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] 
    return documentsURL 
} 

func fileInDocumentsDirectory(_ filename: String) -> String { 

    let fileURL = getDocumentsURL().appendingPathComponent(filename) 
    return fileURL.path 

} 

func saveRefugeOne(image: UIImage) { 
    // Create a file name, and then save the path in your documents with that name 
    let imageFileName:String = "refuge1.jpg" 
    let imagePath = fileInDocumentsDirectory(imageFileName!) 
    saveImage(image, path: imagePath) 
} 

func loadRefugeOne() -> UIImage? { 

    // Get the image back 
    let imageName:String = "refuge1.jpg" // Or whatever name you saved 
    let imagePath = fileInDocumentsDirectory(imageName) 

    if let loadedImage = self.loadImageFromPath(imagePath) { 
     return loadedImage 
    } else { 
     print("Couldn't Load: \(imageName)") 
     return nil 
    } 

} 

// This will be your method to save image 
func saveImage(_ image: UIImage, path: String) { 

    //If you want PNG use this let pngImageData = UIImagePNGRepresentation(image) 
    // But since you mentioned JPEG: 

    if let jpgData = UIImageJPEGRepresentation(image, 1.0) { 
     try? jpgData.write(to: URL(fileURLWithPath: path), options: [.atomic]) 
    } 

} 

// This will load image from saved path. Make sure to store the path 
// somewhere. This makes it easier to save images locally. You can 
// save the image in the documents directory, and then just save the 
// path in CoreData or something similar. 
func loadImageFromPath(_ path: String) -> UIImage? { 

    let image = UIImage(contentsOfFile: path) 

    if image == nil { 

     print("couldn't find image at path: \(path)") 
    } 

    return image 

} 

Hoffentlich helfen. Es ist die Methode, die ich immer benutze, und es funktioniert wie ein Zauber, wenn ich meine eigenen Schritte richtig befolge ;-)

+0

Vielen Dank für Ihre Methoden, es hilft mir sehr. Aber ich habe verschiedene Bildnamen in meinem Dokumentenwörterbuch und DB, das war mein Problem. Aber deine Methoden helfen mir, das herauszufinden. – Alex

1

Es wird nicht empfohlen den absoluten Dateipfad einer Datei in einer iOS App zu speichern (dh alles einschließlich /Users/macbook/Library/Developer/...) , im Reich oder anderswo.

Aus Sicherheitsgründen benennen iOS-Geräte den UUID-Ordnernamen zwischen Starts um. Dies bedeutet, dass der Ordnerpfad zu dem Zeitpunkt, zu dem er gespeichert wurde, gültig war, jedoch nicht zu einem späteren Zeitpunkt.

Stattdessen wird empfohlen, nur den relativen Pfad der Datei zu speichern (z. B. die Position in Bezug auf nur den Ordner Documents. In diesem Fall wäre es nur /refuge1.jpg) und dann dynamisch den absoluten Pfad durch Anforderung erstellen der Documents Verzeichnispfad, wie Sie es brauchen.

+0

Vielen Dank für Ihre Antwort :), sorry, wenn ich Ihre Zeit verschwenden – Alex

Verwandte Themen