2016-11-06 17 views
2

私は[PHCachingImageManager]を使ってビデオをコレクションビューにキャッシュしています。私はキャッシュマネージャで生成された画像を表示できますが、AVAssetsをプルすることはできません。PHCacheImageManager.requestAVAsset(forVideo:...)はnilを返しますAVAsset

.requestAVAsset(forVideo:...)メソッドを使用してAVAssetを取得しようとしましたが、結果ハンドラに返される[asset]はnilです。返された[資産]をアンラップしようとするとエラーが発生します。

私は結果ハンドラに返された[audioMix]と[info]パラメータも調べましたが、それはうまくいきませんでした。誰も私が間違っている/ここで行方不明を知っていますか?

viewDidLoad() { 
    let videosAlbum = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumVideos, options: nil) 
    self.videoAssets = PHAsset.fetchAssets(in: videosAlbum.object(at: 0), options: nil) 

    self.imgCacheManager.startCachingImages(for: self.videoAssets.objects(at: [0, videoAssets.count-1]), targetSize: CGSize(width: 150, height: 150), contentMode: .aspectFit, options: nil) 
} 

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

    let selectedAsset = self.imgCacheManager.requestAVAsset(forVideo: self.videoAssets.object(at: indexPath.item), options: nil, resultHandler: { 
     asset,_,_ in 

     self.delegate.selectedVideo(Asset: asset!) // this is the line I get the error 
    }) 
} 

私のデリゲートはオプションですが、確かにそれで何かを持っているので、私はそれがエラーを投げ、それが開封された[資産]です確信しています。

答えて

4

ネットワークアクセスを許可するようにビデオリクエストオプションを設定せずにiCloudに保存されているビデオアセットをリクエストしようとしていたようです。

PHCachingImageManagerからビデオを要求するとき、私はPHVideoRequestOptionsオブジェクトを渡すことができませんでした。資産を要求する直前の行を追加すると、これが修正されます。

let options = PHVideoRequestOptions() 
options.isNetworkAccessAllowed = true 

this threadは、Photosフレームワークを使用しているオープンソースのイメージピッカーで見つかりました。私がテストしていたビデオは実際にiCloudにあったため、返されたアセットはゼロになりました。リンクされたスレッドには、目的のCで進捗ハンドラを接続する良い例もあります:

options.networkAccessAllowed = YES; 
options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info) 
{ 
... 
}; 
+0

ありがとうございます!コードをSwift4にアップグレードした後、この問題に直面し、 'options.isNetworkAccessAllowed = true'が助けになりました。 –

関連する問題