1

アプリでアセット ライブラリを使用して、デバイスの写真イベントを列挙しています。

iPad でテストすると、私のコードは正常に動作します。写真イベントは列挙されており、完全に処理できます。iPhone でまったく同じコードを試しても、何も起こりません (このデバイスにも Photos Events があります)。列挙コードが呼び出されていないように見えます (つまり、コンソールにログが表示されません。コードを参照)。

コードは次のとおりです。

- (void)loadEvents {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library enumerateGroupsWithTypes:ALAssetsGroupEvent
                           usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
                               if (group) {
                                   [photosEventsArray addObject:group];
                                   NSLog(@"Adding group");
                               } else {
                                   NSLog(@"End of the enumeration");
                               }
                           }
                         failureBlock: ^(NSError *error) {
                     NSLog(@"Failure while enumerating assets: %@", error);
                         }];
    [library release];

    NSLog(@"Found %d events", photosEventsFound);

    [self performSelectorOnMainThread:@selector(stopSpinner) withObject:nil waitUntilDone:YES];
    [pool drain];
}

私の展開ターゲットは iOS 4.1 です。

ここで何がうまくいかないのか考えていますか?

4

1 に答える 1

1

さらに調査した結果、iOS 4.3.5 では、enumerateGroupsWithTypes メソッドをメイン スレッドから呼び出す必要があるようです。

私はこの方法でコードにパッチを当てました (iPhone と iPod Touch から NO を設定し、iPad から YES を設定します):

if (scanAssetsInBackground) {
    [self performSelectorInBackground:@selector(loadEvents) withObject:nil];
} else {
    [self performSelectorOnMainThread:@selector(loadEvents) withObject:nil waitUntilDone:YES];
}

そのパッチで問題なく動作します。

Apple ドキュメントにはこれに関する情報があまりなく、アセット ライブラリをスキャンする正しい方法 (バックグラウンドまたはメイン スレッド) を知る方法はありません。

于 2011-08-31T15:46:48.740 に答える