iOS-从设备获取所有照片并将其保存到应用程序
我想获取保存在设备中的所有照片,并将它们保存到我的应用程序中,然后最终(如果用户允许)删除原始照片 这是我为这项任务创建的整个班级:iOS-从设备获取所有照片并将其保存到应用程序,ios,swift,memory,phasset,photosframework,Ios,Swift,Memory,Phasset,Photosframework,我想获取保存在设备中的所有照片,并将它们保存到我的应用程序中,然后最终(如果用户允许)删除原始照片 这是我为这项任务创建的整个班级: class ImageAssetsManager: NSObject { let imageManager = PHCachingImageManager() func fetchAllImages() { let options = PHFetchOptions() options.predicate = NSPredicate(for
class ImageAssetsManager: NSObject {
let imageManager = PHCachingImageManager()
func fetchAllImages() {
let options = PHFetchOptions()
options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Image.rawValue)
options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
if #available(iOS 9.0, *) {
options.fetchLimit = 5
} else {
// Fallback on earlier versions
}
let imageAssets = PHAsset.fetchAssetsWithOptions(options)
print(imageAssets.count)
self.getAssets(imageAssets)
}
func getAssets(assets: PHFetchResult) {
var assetsToDelete: [PHAsset] = []
assets.enumerateObjectsUsingBlock { (object, count, stop) in
if object is PHAsset {
let asset = object as! PHAsset
let imageSize = CGSize(width: asset.pixelWidth,height: asset.pixelHeight)
let options = PHImageRequestOptions()
options.deliveryMode = .FastFormat
options.synchronous = true
self.imageManager.requestImageForAsset(asset, targetSize: imageSize, contentMode: .AspectFill, options: options, resultHandler: { [weak self]
image, info in
self.addAssetToSync(image, info: info)
assetsToDelete.append(asset)
})
}
}
self.deleteAssets(assetsToDelete)
}
func addAssetToSync(image: UIImage?, info: [NSObject : AnyObject]?) {
guard let image = image else {
return
}
guard let info = info else {
return
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
let imageData = UIImageJPEGRepresentation(image, 0.95)!
let fileUrl = info["PHImageFileURLKey"] as! NSURL
dispatch_async(dispatch_get_main_queue(), {
let photoRootItem = DatabaseManager.sharedInstance.getPhotosRootItem()
let ssid = DatabaseManager.sharedInstance.getSsidInfoByName(ContentManager.sharedInstance.ssid)
let item = StorageManager.sharedInstance.createFile(imageData, name: fileUrl.absoluteString.fileNameWithoutPath(), parentFolder: photoRootItem!, ssid: ssid!)
})
})
}
func deleteAssets(assetsToDelete: [PHAsset]){
PHPhotoLibrary.sharedPhotoLibrary().performChanges({
PHAssetChangeRequest.deleteAssets(assetsToDelete)
}, completionHandler: { success, error in
guard let error = error else {return}
})
}
}
这是可行的,但我的问题是,它只适用于有限数量的照片。当我尝试使用所有这些时,我得到了内存警告,然后应用程序崩溃。我知道为什么。我知道我的问题是我把所有的照片都记在了记忆里,太多了。我可以用那个获取限制获取图像并使其循环,但我不确定这是否是最好的解决方案
我希望通过一些解决方案处理一些照片,然后释放内存,一次又一次,直到结束。但这种变化可能在enumerateObjectsUsingBlock中的某个地方。我不确定这是否有帮助,但我甚至不需要获得图像。我只需要将图像文件从设备路径复制到我的应用程序沙盒路径
这方面的最佳解决方案是什么?如何避免内存警告和泄漏?谢谢将您的dispatch\u async调用更改为dispatch\u sync。然后,在遍历EnumerateObjectsSusingBlock时,您将一次处理一张照片,而不是试图同时处理所有照片。将您的dispatch\u async调用更改为dispatch\u sync。然后,在使用EnumerateObjectsSusingBlock遍历EnumerateObjects时,您将一次处理一张照片,而不是试图同时处理所有照片。您收到任何解决方案了吗?我也面临同样的问题。你有没有收到任何解决方案?我也面临同样的问题。