読者です 読者をやめる 読者になる 読者になる

iOS 8 beta の AssetsLibrary のバグとその対処法

iOS 8 では、写真を削除しても30日以内であれば元に戻すことができる機能 (Recently Deleted アルバム) が追加されました。
この機能の影響なのか、iOS 8 beta では ALAssetsGroup の numberOfAssets が正しい数を返してくれないバグ(?)が発生しています。

iOS シミュレータに最初から入っている5枚の写真のうち1枚を削除して下のコードを実行すると確認できます。

@import AssetsLibrary;
 
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];

[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                             usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
                                 if (group) {
                                     NSLog(@"numberOfAssets: %ld", group.numberOfAssets);
                                 }
                             } failureBlock:nil];
numberOfAssets: 5

写真を1枚削除したのに numberOfAssets は 5 を返しています (本当は 4)。
しかし enumerate してみると asset はちゃんと 4 つにあることになっています。

[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
    if (result) {
        NSLog(@"result: %@", result);
    }
}];
result: ALAsset - Type:Photo, URLs:assets-library://...
result: ALAsset - Type:Photo, URLs:assets-library://...
result: ALAsset - Type:Photo, URLs:assets-library://...
result: ALAsset - Type:Photo, URLs:assets-library://...

ImagePicker を自作していたりすると、これが原因で NSRangeException が起こる可能性があります。
対処法としては、ALAssetsGroup の numberOfAssets を使わずに自分で enumerate してカウントするしかなさそうです。