2017-04-05 29 views
-2

我想列出从“我的照片流”的所有照片,这里是我的代码:如何获得所有照片正确的Swift3的iOS(为什么我得到重复的照片)

private func fetchAssetCollection(){ 
    let result = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumMyPhotoStream, options: nil) 
    result.enumerateObjects({ (collection, index, stop) in 
     if let albumName = collection.localizedTitle { 
      print("Album => \(collection.localIdentifier), \(collection.estimatedAssetCount), \(albumName) ") 
     } 

     let assResult = PHAsset.fetchAssets(in: collection, options: nil) 

     let options = PHImageRequestOptions() 
     options.resizeMode = .exact 
     let scale = UIScreen.main.scale 
     let dimension = CGFloat(78.0) 
     let size = CGSize(width: dimension * scale, height: dimension * scale) 

     assResult.enumerateObjects({ (asset, index, stop) in 
      print("index \(index)") 
      PHImageManager.default().requestImage(for: asset, targetSize: size, contentMode: .aspectFill, options: options) { (image, info) in 
       if let name = asset.originalFilename { 
        print("photo \(name) \(index) \(asset.localIdentifier)") 
       } 
      } 

     }) 

    }) 
} 



extension PHAsset { 

var originalFilename: String? { 

    var fname:String? 

    if #available(iOS 9.0, *) { 
     let resources = PHAssetResource.assetResources(for: self) 
     if let resource = resources.first { 
      fname = resource.originalFilename 
     } 
    } 

    if fname == nil { 
     // this is an undocumented workaround that works as of iOS 9.1 
     fname = self.value(forKey: "filename") as? String 
    } 

    return fname 
} 

}

它作品,但问题是它打印重复的记录。 它打印329 * 2记录,但实际上我有“我的照片流”中的329张照片。

photo IMG_0035.JPG 10 0671E1F3-CB7C-459E-8111-FCB381175F29/L0/001 
photo IMG_0035.JPG 10 0671E1F3-CB7C-459E-8111-FCB381175F29/L0/001 
...... 

回答

2

从文档PHImageManager requestImage

默认情况下,这个方法异步执行。如果您从后台线程调用它,您可以将options参数的isSynchronous属性更改为true,以阻止调用线程,直到请求的图像准备就绪或出现错误,此时Photos会调用您的结果处理程序。

对于异步请求,Photos可能会多次调用您的结果处理程序块。照片首先调用该块,以便在准备高质量图像时提供适合临时显示的低质量图像。 (如果低质量图像数据立即可用,则第一次调用可能在方法返回之前发生。)当高质量图像准备就绪时,Photos会再次调用您的结果处理程序来提供它。如果图像管理器已经以完全质量缓存了所请求的图像,Photos只会调用您的结果处理程序一次。结果处理程序的info参数中的PHImageResultIsDegradedKey键指示照片何时提供暂时的低质量图像。

因此,无论提出请求同步或从info字典检查PHImageResultIsDegradedKey值,看看图像的这种情况是你真正想要保留或忽略的一个。

+0

谢谢,可能我需要仔细阅读文档。 :( – User9527

相关问题