Получить URL-адрес для NSData, сохраненный в CoreData

Я сохраняю UIImage в Core Data. Итак, сначала я конвертирую его в NSData, затем сохраняю.

Мне нужно получить URL для изображения после его сохранения. Я делаю это потому, что хочу запланировать локальное уведомление с вложением, и единственный способ сделать это, AFAIK, это с помощью URL.

Вот мой код:

//my image:  
var myImage: UIImage?
var imageData: NSData?
    if let image = myImage {
    imageData = UIImageJPEGRepresentation(image, 0.5)! as NSData
}
myEntity.setValue(imageData, forKey: "image")

И вот как я должен добавить вложение к уведомлению:
UNNotificationAttachment.init(identifier: String, url: URL>, options: [AnyHashable : Any]?)

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

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

1 ответ

Решение

Вы не можете получить URL. Если вы настроили это свойство для использования внешнего хранилища, то да, технически это может быть URL файла. Может быть. Но нет документированного способа получить его, и в любом случае он может вообще не существовать - потому что для настройки внешнего хранилища не требуется, чтобы Core Data использовала внешнее хранилище, он просто позволяет это делать.

Если вы не использовали этот параметр, то никогда не будет URL-адреса, поскольку изображение сохраняется как часть файла SQLIte.

Если вам нужен URL-адрес файла для изображения, сохраните изображение в файл отдельно от Core Data и сохраните имя файла в качестве свойства объекта. Тогда URL файла - это то место, где вы сохранили файл.

И реализация того, как я сохранил его, а затем получил URL на практике, когда у меня была такая же проблема:

Swift 5:

 func getImageURL(for image: UIImage?) -> URL {
            let documentsDirectoryPath:NSString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
            let tempImageName = "tempImage.jpg"
            var imageURL: URL?

            if let image = image {

                let imageData:Data = image.jpegData(compressionQuality: 1.0)!
                let path:String = documentsDirectoryPath.appendingPathComponent(tempImageName)
                try? image.jpegData(compressionQuality: 1.0)!.write(to: URL(fileURLWithPath: path), options: [.atomic])
                imageURL = URL(fileURLWithPath: path)
                try? imageData.write(to: imageURL!, options: [.atomic])
            }
            return imageURL!
        }
Другие вопросы по тегам