【问题标题】:Memory leak in getting images from gallery to my application从画廊获取图像到我的应用程序时的内存泄漏
【发布时间】:2017-05-03 18:47:44
【问题描述】:

我有这个功能。此函数初始化所有媒体文件以供画廊查看。

func initMediaFiles() {
    var assets: [PHAsset] = []
    let options = PHFetchOptions()
    options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

options.fetchLimit = 1000
    let results = PHAsset.fetchAssets(with: .image, options: options)
    results.enumerateObjects({ (object, _, _) in
        if let asset = object as? PHAsset {
            assets.append(asset)

        }
    })        
 SCPAsset.imageManager.startCachingImages(for: assets, targetSize: CGSize(width: 110.0, height: 147.0),contentMode: .aspectFill,  options: nil)
    for asset in assets {
        let scpAsset = SCPAsset(initWithPHAsset: asset)
        scpAsset.inspectionUUID = self.inspectionId!
        self.mediaAssets.append(scpAsset)
    }

}

我无法理解为什么每次加载图库视图时都会发生 10,000 次内存泄漏。

【问题讨论】:

    标签: ios swift memory-leaks phasset


    【解决方案1】:

    这是我在一个项目中所做的可能会有所帮助的事情:

    一些属性:

     let requestOptions = PHImageRequestOptions()
        let fetchOptions = PHFetchOptions()
        let cachingImageManager = PHCachingImageManager()
        var assets: [PHAsset] = [] {
            willSet {
                cachingImageManager.stopCachingImagesForAllAssets()
            }
    
            didSet {
                cachingImageManager.startCachingImagesForAssets(assets,
                    targetSize: PHImageManagerMaximumSize,
                    contentMode: .AspectFit,
                    options: self.requestOptions
                )
            }
        }
    
    
        func fetchPhotos() {
            requestOptions.resizeMode = PHImageRequestOptionsResizeMode.Exact
            requestOptions.version = .Current
            requestOptions.deliveryMode = PHImageRequestOptionsDeliveryMode.HighQualityFormat
            requestOptions.synchronous = true
    
            fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: false)]
            if #available(iOS 9.0, *) {
                fetchOptions.fetchLimit = 50
            } else {
    
                // Fallback on earlier versions
            }
    
            fetchResults = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions)
            guard let fetchResults = fetchResults else {
                print("No PHAssets")
                return
            }
            dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) { [weak self] in
                fetchResults.enumerateObjectsUsingBlock{ object, index, stop in
                    let asset = object as! PHAsset
                    self?.assets.append(asset)
                }
                dispatch_async(dispatch_get_main_queue()) {
                    self?.photoCollectionView.reloadData()
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 2011-02-25
      相关资源
      最近更新 更多