PHAsset からサムネイルやその他の情報を取得しようとしています。簡略化されたコード スニペットを次に示します。
カメラロールから取得したすべての画像に対して、次のようにします。
static func fetchAsset(asset: PHAsset)
{
if(asset.mediaType == PHAssetMediaType.Image){
let screenScale: CGFloat = UIScreen.mainScreen().scale
let imageSize = CGSize(width: 100 * screenScale, height: 100 * screenScale)
let options: PHImageRequestOptions = PHImageRequestOptions()
options.deliveryMode = PHImageRequestOptionsDeliveryMode.FastFormat
options.resizeMode = PHImageRequestOptionsResizeMode.Fast
options.synchronous = false
PHImageManager.defaultManager().requestImageForAsset(asset,
targetSize: imageSize,
contentMode: PHImageContentMode.AspectFill,
options: options,
resultHandler: { (result, info) -> Void in
if (result != nil && result!.scale == screenScale) {
var newItemImage = MyImage(isLocal:true)
if let fname = asset.valueForKey("filename") as? String{
newItemImage.fileName = fname
}
newItemImage.thumbnail = result
asset.requestContentEditingInputWithOptions(PHContentEditingInputRequestOptions()) { (contentEditingInput, info) -> Void in
//Get full image
let url = contentEditingInput!.fullSizeImageURL
newItemImage.url = url
}
//DO SOMWTHING WITH IMAGE
}else
{
//DO SOMWTHING ELSE
}
})
}
}
この段階で 2 つの問題があります。
- 最も重要なものですが、それは結果的なものだと思います。処理能力とディスクからの読み取りが多すぎます。エミュレータでは問題なく動作します。しかし、300 ~ 500 枚の画像があるテスト デバイス (iPhone 5、4S) で実行すると、すべての画像を取得している間に 1 ~ 2 分間フリーズします。コレクション全体を1つずつ読み取り、サイズを変更して、このすべての情報をフェッチすると思います。もっと簡単な方法はありますか?ALAsset で可能だったように、サムネイルを直接取得するだけで、すばやく飛んでいました。
- 何らかの理由で2回仕事をします。最初に、私が求めていたもの、小さなサムネイル〜60 * 40またはその前後が表示されます。それが私に与えられたら、数秒後に別のループに進み、960 * 640 などの高解像度の画像の取得を開始し、そこでフリーズが発生します。なぜこれが起こっているのかわかりませんが、そうです。
これら 2 つの問題に関する情報は、高く評価されます。