从核心数据中的文档目录保存图像路径,仅检索部分图像。迅速

时间:2016-04-05 01:03:27

标签: ios swift core-data uiimage nsdocumentdirectory

我正在使用Swift创建一个应用程序,它将使用CloudKitCore Data保存和检索图像。使用CloudKit,我将图像保存为CKAsset并使用Core Data将图像保存在文档目录中,然后将路径名称存储在Core Data中。当我的应用程序开始加载时,它将首先查找本地存储的任何项目,然后检查云是否存储本地数据(节省大量加载时间)。无论如何,当我从CloudKit加载图像时,它们都很好,而Core Data和文档目录路径大部分时间都是相同的。当我在Core Data使用他们的路径名加载图像时,我一直在注意这个问题,基本上图像仅部分返回,其中一些是灰色的,好像它停止了85%的通过或者某些东西。很难找到一个很好的例子,因为它不会一直发生,但这是我能找到的最好的猫: Partial Cat Image

看看顶部大约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

}

如果有人对如何解决这个问题有任何好的想法,或者甚至想知道为什么会这样,我会非常感激。我的第一个想法是,因为我正在使用CloudKitCore Data,这可能在某些时候我的应用程序正在保存正在通过CloudKit异步加载的图像,并且然后以某种方式中断...但基于我如何编程它不应该发生。我很想知道这是否是一个常见的问题,或者是否有其他人经历过并征服过它。提前谢谢!

1 个答案:

答案 0 :(得分:0)

我在通知扩展中找到了这个,我不得不做这样的事情。不知道为什么。

Observable.FromEvent*