私はイメージ・ピッカー・ライブラリを使用して、フォト・ライブラリから多くのイメージを選択できます。それらはPHAssets
の配列として返されます。次に、PHAssets
をすべてUIImages
に変換し、アプリのストレージに書き込んでいます。PHAssetsとrequestImageForAssetを呼び出してメモリを大量に使用する
現在、私はすべての資産をループしており、requestImageForAsset
を同期して呼び出しています。私の問題は、このループが実行されているときに、非常に高いメモリ使用量のスパイクがあるということです(イメージが30個あり、最大130MBになります)。私はこれを防ぐつもりです。ログに基づいて
for(PHAsset *asset in self.assets) {
NSLog(@"started requesting image %i", i);
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:[self imageRequestOptions] resultHandler:^(UIImage *image, NSDictionary *info) {
dispatch_async(dispatch_get_main_queue(), ^{
assetCount++;
NSError *error = [info objectForKey:PHImageErrorKey];
if (error) NSLog(@"Image request error: %@",error);
else {
NSString *imagePath = [appDelegate.docsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%i.png",i]];
NSData *imageData = UIImagePNGRepresentation(image);
if(imageData) {
[imageData writeToFile:imagePath atomically:YES];
[self.imagesArray addObject:imagePath];
}
else {
NSLog(@"Couldn't write image data to file.");
}
[self checkAddComplete];
NSLog(@"finished requesting image %i", i);
}
});
}];
i++;
}
、私は完了ブロックのすべて、その後、すべての「開始要求画像がX」最初に呼び出されていることがわかり(「画像xを要求終了」:ここでは
は私のコードです)。私はこれが記憶上の問題に寄与していると思います。これらのリソースを解放して次の反復に移る前に、各反復の完了ブロックが呼び出されることを保証することは、おそらくメモリーの消費量が少なくなります。これどうやってするの?
ありがとうございました。私はforループで@autoreleasepoolを試しましたが、そこにそれを置くと結果ハンドラがトリックでした! – Charles
このトリックは私のためには機能しません。 :-s –