如何在Swift3 iOS中正确获取所有照片(为什么我会获得重复的照片)

时间:2017-04-05 15:56:24

标签: ios swift swift3 photo phassetcollection

我想列出“我的照片流”中的所有照片,这是我的代码:

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
......

1 个答案:

答案 0 :(得分:2)

来自PHImageManager requestImage的文档:

  

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

     

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

因此,要么使请求同步,要么检查PHImageResultIsDegradedKey字典中的info值,以查看该图像实例是否是您实际希望保留或忽略的那个。