2017-04-05 65 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

相關問題