2017-05-03 37 views
0

我有这个功能。此功能将初始化所有媒体文件以查看图库。从图库中获取图像到我的应用程序的内存泄漏

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) 
    } 

} 

我无法理解为什么我每次我打开图库查看时间越来越像万内存泄漏。

回答

0

这里的东西我在一个项目完成,这可能有助于:

一些特性:

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() 
      } 
     } 
    }