0

ALAssetLibraryのアイテム数を数える最速の方法を探しています。私は、少なくとも現時点では、そこにある/ what /を気にしません。そこには、ほとんど多くのものがあります。

音楽/ミュージックビデオの場合、それは簡単です:

MPMediaQuery* query = [[MPMediaQuery alloc] init];
int numItems = [[query items] count];

ALAssetLibraryの場合、私が思いついた最高のものは、このようなクレイジーなものです(ここで手動で入力したため、エラーが発生する可能性があります)。

    ALAssetsLibrary* assetLibrary = [[ALAssetsLibrary alloc] init];
    ALAssetsGroupType groupType = ALAssetsGroupAll;
    int numAssets=0;

    [assetLibrary enumerateGroupsWithTypes:groupType 
                                usingBlock:^(ALAssetsGroup* group, BOOL* stop){
         if (group)
         {
             [group enumerateAssetsUsingBlock:^(ALAsset* asset, NSUInteger index, BOOL* innerstop)
              {
                  if (asset)
                  {
                       numAssets++;
                  }
              }];
         }
     }];

写真/ビデオが10枚しかない場合でも、モバイルデバイスでも、数千枚になる可能性があります。

さらに、ブロック内にあるため、このコードを同期させるためにこのコードの周囲にロックを設定する必要があり、処理速度がさらに低下します。

この種のことを行うためのより良い方法がある/got/があります。誰?

-ケン

4

1 に答える 1

2

確かに、より良い方法があります:

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
int __block numAssets = 0;
[library enumerateGroupsWithTypes:ALAssetsGroupAll
    usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
        if (group)
            numAssets += group.numberOfAssets;
        else
            NSLog(@"Asset count is: %i", numAssets);
        }
        failureBlock:^(NSError *err) {
            NSLog(@"Failure");
        }];
于 2013-03-29T09:22:27.383 に答える