我正在使用[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