ALAssetsLibrary enumerateGroupsWithTypes: -Синхронизация потоков

Я использую [ALAssetsLibrary enumerateGroupsWithTypes:] для хранения ALAsset в массиве. Поскольку это асинхронная операция, мне нужно дождаться ее завершения, прежде чем продолжить работу.

Я прочитал Синхронизацию потоков какао при использовании [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];
}

5
задан Community 23 May 2017 в 10:00
поделиться