2017-01-09 2 views
0

В моем приложении я сохраняю изображение в локальном хранилище, и я сохраняю путь этого изображения в своей базе данных Realm. А теперь у меня проблемы с загрузкой этого изображения с этого пути?Проблемы с загрузкой пути изображения из области в Swift

То, как я сохранить путь к базе данных:

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 

Это просто, что я пытаюсь получить изображение из этого meditation.imagePath пути. Я дважды проверил путь, изображение все еще не может установить изображение, используя этот путь, есть ли что-то, что отсутствует?

В режиме отладки я вижу это:

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;} 

но мое переменное изображение еще NIL в режиме отладки

// 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 

Я вижу имя медитации и звука, боты не OMG.

ответ

0

Попробуйте это:

// 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 

} 

Надеюсь, это поможет. Это метод, который я всегда использую, и он работает как шарм, когда я следую своим собственным шагам вправо ;-)

+0

Спасибо за ваши методы, это мне очень помогает. Но у меня разные имена изображений в словаре документов и БД, это была моя проблема. Но ваши методы помогают мне разобраться в этом. – Alex

1

Не рекомендуется сохранять абсолютный путь к файлу файла в приложении iOS (то есть все, включая /Users/macbook/Library/Developer/...) , в Королевстве или где-либо еще.

Из соображений безопасности устройства iOS переименовывают имя папки UUID между запусками. Это означает, что, хотя путь папки был действителен в момент его сохранения, он не будет на более поздний срок.

Вместо этого рекомендуется сохранить только относительный путь к файлу (например, его местоположение по отношению к папке Documents. В этом случае это будет всего лишь /refuge1.jpg), а затем динамически построить абсолютный путь, запросив путь к каталогу Documents по мере необходимости.

+0

Спасибо за ваш ответ :), извините, если я трачу ваше время – Alex

Смежные вопросы