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

Я работаю над созданием приложения с Swift, которое будет сохранять и извлекать изображения с использованием CloudKit и Core Data. С помощью CloudKit я сохраню изображение как CKAsset, а с помощью Core Data я сохраню изображение в каталоге документов, а затем сохраню путь в Core Data. Когда мое приложение начинает загружаться, оно сначала ищет любые элементы, хранящиеся локально, а затем проверяет облако, если локальные данные не сохранены (экономит много времени загрузки). В любом случае, когда я загружаю изображения из CloudKit, они в порядке, и то же самое касается Core Data и пути к каталогу документов большую часть времени. Я периодически замечал эту проблему, когда изображения загружались в Core Data с использованием их имени пути, по сути, изображение возвращается только частично, некоторые из них выделены серым цветом, как будто оно перестало рисовать на 85% пути или что-то в этом роде. Трудно найти хороший пример, потому что это происходит не постоянно, но вот лучший пример моего кота, который я смог найти: Частичное изображение кошки

Видите, примерно 15% изображения вверху просто серые? Он никогда не привязан к какой-либо конкретной части изображения, происходит сверху, слева, справа, снизу и даже посередине. И, как я уже сказал, это вовсе не хроническая проблема. Вот мой код, используемый для хранения изображения в каталоге документов и сохранения имени пути в Core Data:

// Make the unique path for the Image Name and save it
let userImageName:String = "savedUserImage\(indexForImageName).jpg"
let imagePath = saveInDocumentsDirectory(userImageName)

// Save the game's reference image in the documents directory
self.saveImage(user.referenceImage, path: imagePath)

func saveImage (image: UIImage, path: String ) {

    let jpgImageData = UIImageJPEGRepresentation(image, 1.0)
    jpgImageData?.writeToFile(path, atomically: true)

}

func documentDirectoryURL() -> NSURL {
    let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
    return documentsURL
}

func saveInDocumentsDirectory(filename: String) -> String {

    let fileURL = documentDirectoryURL().URLByAppendingPathComponent(filename)
    return fileURL.path!

}

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

if let image = newUser.imageName {
    let imagePath = saveInDocumentsDirectory(image)

    if let loadedImage = loadImageFromPath(imagePath) {

        user.referenceImage = loadedImage

    } else { self.customDelegate.alertUserErrorLoadingImage() }
}

func loadImageFromPath(path: String) -> UIImage? {

    let image = UIImage(contentsOfFile: path)

    if image == nil {

        self.customDelegate.alertUserErrorLoadingImage()
    }

    return image

}

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


person Pierce    schedule 05.04.2016    source источник
comment
Вы нашли решение этой проблемы? Я вижу то же самое в расширениях уведомлений.   -  person Sam Jarman    schedule 26.08.2016
comment
Эй, Сэм. Вы знаете, я до сих пор не нашел решения этой проблемы. Я заметил, что это происходит реже, хотя. В итоге я изменил все свои операции с Core Data, чтобы они выполнялись асинхронно, и теперь это редко происходит, но да, это все еще происходит. Я как бы только что работал над этим, но это все еще сводит меня с ума.   -  person Pierce    schedule 28.08.2016


Ответы (1)


Я нашел это в расширениях уведомлений, и мне пришлось сделать что-то вроде этого. Не знаю, почему.

let data = try! Data(contentsOf: attachment.url)
self.imageView.image = UIImage(data: data) //Must use data, doesn't work right with loading straight into image
person Sam Jarman    schedule 12.09.2016
comment
Интересно! Спасибо за публикацию этого ответа. Я попытаюсь внедрить это решение в свой код, чтобы посмотреть, решит ли оно мою проблему. Я дам Вам знать! - person Pierce; 13.09.2016