我正在开发一款可让用户录制视频和照片的应用。现在我想知道存储它们的最佳方法是什么?
第一个想法当然是将其保存在用户的照片库中,就好像他已经从相机应用程序中记录了照片,并使用对文件的引用。现在存在用户可以访问和删除照片应用程序中的文件的问题,我的应用程序可能仍然需要这些文件。我不认为我可以阻止用户删除照片,但我如何处理我的应用程序会遇到的不一致?
另一种方法是自己照顾存储。我的应用程序已经使用了Core Data,因此我可以使用NSValueTransformer
将媒体文件转换为NSData
对象,并将其作为BLOB存储在Core Data中。然后还有一些关于性能的问题。我知道基于SQLite的核心数据可以完美地处理大小为几GB的数据库,但是加载大型数据对象需要花费一些时间。显而易见的优点是用户不会使我的应用程序不一致,但性能损失是否可以接受?最重要的是:如果我使用UIImagePickerController
来捕捉照片和视频,无论如何它都会将其保存在图书馆中。要将其保存在Core Data中,我必须从那里拍摄照片,将其转换为NSData
对象,保存并再次从库中删除它。这对我来说似乎不是正确的方法。此外,UIKit为我提供了通过NSData
从照片中获取UIImageJPEGRepresentation()
对象的功能,但似乎没有转换视频的功能。
总而言之,由于所有未解决的问题,我想使用第一种方法。但是不一致问题困扰着我。处理它的最佳做法是什么?
答案 0 :(得分:9)
对于照片:
UIImagePickerController会在内存中返回一个UIImage,所以你不必做任何事情,不要把它从用户的照片库中取出并保存在你的核心数据中......
视频:
您可以使用NSData *data = [NSData dataWithContentsOfFile:]
或[NSData dataWithContentsOfUrl:]
获取数据,以获取视频的NSData对象。您可以轻松获得videoUrl
所以,我刚刚纠正了一些错误的假设。
您无需将其直接保存到CoreData。您可以将其保存到应用程序的文档文件夹中,然后用户将无法删除它。此外,保存到应用程序的文档文件夹并仅保存到CoreData的链接也将使您的灵魂无法处理大数据对象。
问题可能是您需要处理文件存储。
我认为这里没有最好的做法。
保存在用户的照片库中,无需访问您的应用即可帮助用户更轻松地查看照片和视频
在CoreData中保存对您来说可能更容易,并且可能会更快一些
保存到文件存储可能有助于您在加载视频时不处理某些二进制问题,因为Apple MPMoviePlayerController可能会帮助您
对我来说,因为我没有使用太多SQLite和Core Data,所以我选择存储到文件系统
答案 1 :(得分:2)
使用代码数据存储图像和大文件。
代码数据可以自动将二进制数据保存到磁盘上,只需在属性的属性上设置此选项,您只需要激活选项以允许外部存储,而核心数据将为您带来魔力,简单就是这样
这里是你在Swift3中的功能
//Image
let imageData = UIImageJPEGRepresentation(image, 1) // You can low compression up to >0
//Video from URL
let videoData = NSData(contentsOf:videoURL!)
它如此简单! iOs甜蜜编程。
答案 2 :(得分:0)
使用 CoreData 需要这样压缩图像:
let imageData = UIImage(imageLiteralResourceName:"Dummy1").jpegData(compressionQuality: 1)
在本例中,Dummy1 位于 Assets.xcassets 中。