我正在尝试从专辑中获取图像,并且此代码从特定专辑中获取所有图像,但是在滚动应用程序上将关闭并给出错误“调试器消息:由于内存问题而终止”。请检查代码并找到错误。(我想获取所有相册和图像,例如“ Lalalab”应用,而不会发出内存警告)。
func fatchImagesfromAlbum() {
DispatchQueue.global(qos: .background).async {
self.photoAssets = self.fetchResult as! PHFetchResult<AnyObject>
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue)
self.photoAssets = PHAsset.fetchAssets(in: self.assetCollection, options: fetchOptions) as! PHFetchResult<AnyObject>
for i in 0..<self.photoAssets.count{
let asset = self.photoAssets.object(at: i)
let imageSize = CGSize(width: asset.pixelWidth,
height: asset.pixelHeight)
let options = PHImageRequestOptions()
options.deliveryMode = .fastFormat
options.isSynchronous = true
self.imageManager.requestImage(for: asset as! PHAsset, targetSize: imageSize, contentMode: .aspectFill, options: options, resultHandler: { (image, info) -> Void in
self.images.append(image!)
let url:NSURL = info!["PHImageFileURLKey"] as! NSURL
let urlString: String = url.path!
let theFileName = (urlString as NSString).lastPathComponent
print("file name\(info!)")
self.imageName.append("\(theFileName)")
self.imagePath.append("\(urlString)")
})
print(self.imagePath)
print(self.imageName)
DispatchQueue.main.async
{
[unowned self] in
self.collectionView.reloadData()
}
}
}
PHPhotoLibrary.shared().register(self)
if fetchResult == nil {
let allPhotosOptions = PHFetchOptions()
allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
fetchResult = PHAsset.fetchAssets(with: allPhotosOptions)
}
}
答案 0 :(得分:1)
面对这样的问题;它与进行weak
或unowned
引用无关。通过Objective-C代码或使用Cocoa类创建对象后,您应该做的是处理autoreleasepool,请尝试在autoreleasepool
内调用方法:
autoreleasepool {
fatchImagesfromAlbum()
}
应该是fetchImagesfromAlbum
而不是fatchImagesfromAlbum
吗?
引用Advanced Memory Management Programming Guide:
自动释放池块提供了一种您可以放弃的机制 对象的所有权,但要避免成为对象的可能性 立即释放(例如,当您从 方法)。通常,您不需要创建自己的自动发布池 块,但在某些情况下您必须或必须 这样做是有益的。
然而,应该不需要在autoreleasepool
中执行整个方法,可能是由于执行{{ 1}}或fetchAssets
迭代(在requestImage
循环内)。
引用:Is it necessary to use autoreleasepool in a Swift program?
答案 1 :(得分:0)
您需要创建一个diapatch组,然后每当运行循环时,输入group并离开。循环完成后,您可以调用diapatch.notify并重新定义您的UI