我希望有人可以帮助我,我已经搜索过Stackoverflow和谷歌,但我无法获得正确的解决方案。
我有一个非常简单的应用程序拍摄照片(通过UIImagePickerController使用标准iOS相机)然后我将其保存到分辨率非常低的文件系统 - let thumbNailData = UIImageJPEGRepresentation(image, 0.02)
之后我使用集合视图显示图像核心数据 - 我只保存核心数据中的文件名,而不是图像,图像仅存储在文件系统中。
因此,当我运行应用程序时,它向我显示内存使用量不超过15 MB,并且Process约为1-2%。一切运行正常,但在添加6-7张照片后,我得到奇怪的错误,如内存警告,丢失与我的iPhone连接,以及:
Communications error: <OS_xpc_error: <error: 0x198adfa80> { count = 1, contents =
"XPCErrorDescription" => <string: 0x198adfe78> { length = 22, contents = "Connection interrupted"
所以,我真的被卡住了,我认为我做得非常轻巧,然后我得到了这些错误.... 我已经向App Store提交了一个笔记应用程序,这个应用程序的功能比这个程序高得多,但是这个程序非常稳定......
有什么想法吗?
以下是我的一些代码: //这里我将图片名称加载到数组中以显示在集合视图中
func loadColl () {
let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
let context:NSManagedObjectContext = appDelegate.managedObjectContext!
let fetchRequest:NSFetchRequest = NSFetchRequest(entityName: "PictureNote")
var error:NSError?
var result = context.executeFetchRequest(fetchRequest, error: &error) as [PictureNote]
for res in result {
println(res.latitude)
println(res.longitude)
println(res.longDate)
println(res.month)
println(res.year)
println(res.text)
pictures.append(res.thumbnail)
}
}
//这是在集合视图中显示的代码
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let myImageCell:ImageCell = myCollectionView.dequeueReusableCellWithReuseIdentifier("imageCell", forIndexPath: indexPath) as ImageCell
myImageCell.imageCell.image = self.loadImageFromPath(fileInDocumentsDirectory(self.pictures[indexPath.row]))
return myImageCell
}
//这是从磁盘加载图片的代码
func loadImageFromPath(path: String) -> UIImage {
let image = UIImage(contentsOfFile: path)
if image == nil {
self.newAlert("Error loading your image, try again", title: "Notice")
}
return image!
}
//这是我的保存代码
func saveNewEntry () {
var unique = NSUUID().UUIDString
var imageTitle = "Picture\(unique).jpg"
var image = self.pickedImageView.image
var path = fileInDocumentsDirectory(imageTitle)
var thumbImageTitle = "ThumbPicture\(unique).jpg"
var thumbPath = fileInDocumentsDirectory(thumbImageTitle)
if self.saveImage(image!, path: path) == true && self.saveThumbImage(image!, thumbPath: thumbPath) == true {
// Create the saving context
let context = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!
let entityOne = NSEntityDescription.entityForName("PictureNote", inManagedObjectContext: context)
let thisTask = PictureNote(entity: entityOne!, insertIntoManagedObjectContext: context)
// Get all the values here
self.getMyLocation()
var theDate = NSDate()
thisTask.month = Date.toString(date: theDate, format: "MM")
thisTask.year = Date.toString(date: theDate, format: "yyyy")
thisTask.longDate = theDate
thisTask.longitude = getMyLocation()[1]
thisTask.latitude = getMyLocation()[0]
thisTask.text = self.noteTextView.text
thisTask.imageURL = imageTitle
thisTask.thumbnail = thumbImageTitle
thisTask.id = unique
// Saving to CoreData
if context.save(nil) {
self.newAlert("Saving your note was successful!", title: "Notice")
self.noteTextView.text = ""
} else {
self.newAlert("Error saving your note, try again", title: "Notice")
}
} else {
self.newAlert("Error saving your image, try again", title: "Notice")
}
self.pickedImageView.image = UIImage(named: "P1000342.jpg")
}
我非常感谢每一个建议......如果你需要更多代码,请告诉我......
答案 0 :(得分:2)
我注意到您使用了与UIImageJPEGRepresentation
相关的显着降低的品质因数。如果这是尝试减少所涉及的内存,那么所做的只是减少对永久存储的写入NSData
的大小,但是将该图像加载到图像视图中仍然需要大约( 4×宽×高)字节(注意,这是图像的尺寸,而不是图像视图)。因此,无论UIImageJPEGRepresentation
使用的品质因素如何,来自iPhone的3264×2448图像每张图像占用30mb。
通常我会确保我的集合/表格视图使用缩略图表示(thumbnail
或resize the default representation我自己的ALAsset
属性。如果我在任何地方缓存此缩略图(例如您的问题建议的持久存储),我可以使用缩略图的高质量表示(我使用PNG因为压缩无损,但JPEG 0.7-0.9品质因数是一个也是相当忠实的版本。)