Я использую [ALAssetsLibrary enumerateGroupsWithTypes:] для хранения ALAssets в массиве. Поскольку это асинхронная операция, мне нужно дождаться ее завершения, прежде чем продолжить работу.
Я прочитал Синхронизация потоков какао при использовании [ALAssetsLibrary enumerateGroupsWithTypes:] и попробовал рекомендованный 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];
}