enumerateGroupsWithTypes

enumerateGroupsWithTypes

我正在使用[ALAssetsLibrary enumerateGroupsWithTypes:]将ALAssets存储在数组中。由于这是异步操作,因此我需要等待它完成才能继续工作。

我阅读了Cocoa thread synchronisation when using [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];
}

最佳答案

您要在完成对对象的枚举之前将其杀死。
将其移动到您的.h文件中,然后在dealloc中释放它。

关于iphone - ALAssetsLibrary enumerateGroupsWithTypes : - Thread synchronization,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6257250/

10-13 02:05