我正在使用[ALAssetsLibrary enumerateGroupsWithTypes:]将ALAssets存储在一个数组中。由于这是一个异步操作,我需要等待它完成才能继续工作。ALAssetsLibrary enumerateGroupsWithTypes: - 线程同步
我读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];
}
我不认为这是正确的。在完成之前,enumerateGroupsWithTypes几乎可以肯定地保留它自己的对象。如果你使用NSLog来查看assetLibrary的retainCount,你会发现它在发布后仍然是1。 – 2013-02-05 06:13:08