ALAsset'leri bir dizide saklamak için [ALAssetsLibrary enumerateGroupsWithTypes:] kullanıyorum. Bu bir zaman uyumsuz işlem olduğundan, işime devam etmeden önce bitmesini beklemek zorundayım.ALAssetsLibrary enumerateGroupsWithTypes: - İş parçacığı eşitlemesi
Cocoa thread synchronisation when using [ALAssetsLibrary enumerateGroupsWithTypes:] okudum ve önerilen NSConditionLock'ı denedim. Bununla birlikte, bloklar her zaman ana iş parçacığı içinde gerçekleştirilir, böylece eğer durum kilidini kullanarak beklersem, ana iş parçacığı engellenir ve bloklar çalıştırılamaz -> Sabit kaldım. Yeni bir iş parçacığı üzerinde loadAssets yöntemini çalıştırmayı denedim, ancak yine de bloklar ana iş parçacığı üzerinde çalıştırılıyor.
Numaralandırma işleminin bitmesini beklemenin bir yolunu bulamıyorum. Blokları ana iş parçasından farklı bir iş parçacığına ya da yapabileceğim başka bir iş parçasına zorlamak için bir yol var mı?
- (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];
}
Bunun doğru olduğunu düşünmüyorum. enumerateGroupsWithTypes, neredeyse tamamlanana kadar nesneyi kendisi için korur. RetainCount of assetsLibrary öğelerini görmek için NSLog kullanıyorsanız, yayınlandıktan sonra hala 1 olduğunu görürsünüz. –