iphone - ALAssetsLibrary enumerateGroupsWithTypes : - Thread synchronization

标签 iphone cocoa-touch nslock alassetslibrary

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

我读到Cocoa thread synchronisation when using [ALAssetsLibrary enumerateGroupsWithTypes:]并尝试了推荐的 NSConditionLock。然而,这些 block 总是在主线程中执行,因此,如果我使用条件锁等待,主线程将被阻塞,并且这些 block 将不会被执行 -> 我被卡住了。 我什至尝试在新线程上运行方法 loadAssets,但 block 仍然在主线程上执行。

我找不到实际等待枚举完成的方法。有没有办法将 block 强制到与主线程不同的线程或我可以做的其他事情?

代码如下:

- (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];
}

最佳答案

在完成枚举对象之前,您正在终止 assetLibrary 对象。 将其移至您的 .h 文件并在 dealloc 中释放它。

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

相关文章:

Swift:了解 NSLock 死锁

php - 通过 Twillion 将联系人分享到 iPhone

iphone - 从NSMutableArray返回的自动释放对象

iphone - 可以滚动 UITabBar 吗?

iphone - 我可以在企业开发者计划中注册多少台设备

ios - nsdictionary 中的 block ?

ios - 使用 dequeueReusableCellWithIdentifier 时保留单元格之间的单元格属性

objective-c - 没有正确使用 NSLock,但似乎仍然有效

iphone - IOS SDK - NSLock 消息 : "unlocked from thread which did not lock it"

iphone - iPhone如何自动插入小数位?