[ALAssetsLibrary enumerateGroupsWithTypes:] を使用して、ALAssets を配列に格納しています。これは非同期操作であるため、作業を続行する前に完了するのを待つ必要があります。
[ALAssetsLibrary enumerateGroupsWithTypes:] を使用する場合の Cocoa スレッド同期を読み、推奨される NSConditionLock を試しました。ただし、ブロックは常にメイン スレッドで実行されるため、条件ロックを使用して待機すると、メイン スレッドがブロックされ、ブロックが実行されません -> スタックします。メソッド loadAssets を新しいスレッドで実行しようとしましたが、それでもブロックはメイン スレッドで実行されます。
列挙が完了するのを実際に待つ方法が見つかりません。ブロックをメインスレッドとは別のスレッドに強制する方法や、他にできることはありますか?
コードは次のとおりです。
- (void)loadAssets
{
assets = [NSMutableArray array];
NSConditionLock *threadLock = [[NSConditionLock alloc] initWithCondition:THREADRUNNING];
void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop)
{
if(result != nil)
{
[assets addObject:result];
}
};
void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop)
{
if(group != nil)
{
[group enumerateAssetsUsingBlock:assetEnumerator];
}
[threadLock lock];
[threadLock unlockWithCondition:THREADFINISHED];
};
void (^assetFailureBlock)(NSError *) = ^(NSError *error)
{
[threadLock lock];
[threadLock unlockWithCondition:THREADFINISHED];
};
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock:assetFailureBlock];
[threadLock lockWhenCondition:THREADFINISHED];
[threadLock unlock];
[assetsLibrary release];
[threadLock release];
}