В iOS 4.x я пытаюсь перечислить все фотографии на устройстве и, когда это будет завершено, обработать этот список далее в том же методе.
Поскольку блоки enumerateGroupsWithTypes работают асинхронно надругой поток, и я не могу видеть, как не допустить продолжения выполнения основного потока, мое решение не допустить, чтобы дальнейшая обработка начиналась до готовности, это опросить массив фотографий, которые я собираю, до тех пор, пока не обнаружит, что он завершил заполнение включением.объекта NSNull в конце.
В iOS 4.0 все работает нормально - опрос продолжается, поскольку другой поток перечисляет фотографии, а затем выполнение продолжается в главном потоке, когда это делается.В iOS 4.1+ опрос - это то, как мешает другому потоку выполнить любой из его блоков, так что опрос застревает в бесконечном цикле.
Есть ли лучший способ добиться этого, кроме принятия асинхронного характераперечисление путем разбивки дальнейшей обработки на другой метод, который может вызвать блок перечисления?
Бонусные баллы: почему мой подход к опросу работает на 4.0, а не на 4.1 +?
NSMutableArray *photos = [NSMutableArray new];
void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
if(result != NULL) {
[photos addObject:result];
}
};
void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) {
if(group != nil)
[group enumerateAssetsUsingBlock:assetEnumerator];
else
[photos addObject:[NSNull null]];
};
ALAssetsLibrary *library = [ALAssetsLibrary new];
[library enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:assetGroupEnumerator
failureBlock:^(NSError *error) {
NSLog(@"%@", error);
}];
// keep polling until the photos have all been enumerated
// (NSNull is the last 'photo' added)
while (![photos count] || ![[photos objectAtIndex:[photos count]-1] isEqual:[NSNull null]]);
// ... further processing ...