прервать итерацию фотографий ALAssetsLibrary

Как прорваться через перечисление, происходящее для метода enumerateAssets ALAssetsLibrary с логическим набором. Могу ли я просто выйти из петли?

КОД:

[self.library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    @try {
        if(group != nil) {
            @autoreleasepool {
                    int newNumberOfPhotos = [group numberOfAssets];
                    if (self.numberOfPhotosInSavedPhotos < newNumberOfPhotos) {
                        //only new photos

                        NSRange range = NSMakeRange(self.numberOfPhotosInSavedPhotos, newNumberOfPhotos-self.numberOfPhotosInSavedPhotos);
                        NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:range];
                        [group enumerateAssetsAtIndexes:indexSet options:0 usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
                            @autoreleasepool {
                               if(someCondition)  {
 //get out of the enumeration block (that is, exit the method) or go to complete block
                                }

                                NSString *assetType = [result valueForProperty:ALAssetPropertyType];
                            }
                        } ];
               }         
            }
        } else {
            //enumeration ended

        }

    }
    @catch (NSException *e) {
        NSLog(@"exception streaming: %@", [e description]);
    }
}failureBlock:^(NSError *error){
    NSLog(@"Error retrieving albums stream: %@", [error description]);
    if (error.code==-3312  || error.code==-3311) {
    }
}];

person Nikita P    schedule 01.04.2013    source источник
comment
можешь пожалуйста! более конкретно, где вы застряли и нужна помощь? размещение соответствующего кода будет полезно для понимания вашей проблемы.   -  person swiftBoy    schedule 01.04.2013


Ответы (1)


Чтобы остановить перечисление активов, просто установите *stop = YES в блоке перечисления.

Если вы хотите остановить как внешнее, так и внутреннее перечисление, используйте разные имена для переменной остановки и установите для обеих значение YES:

[self.library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *outerStop) {
    ...
    [group enumerateAssetsAtIndexes:indexSet options:0 usingBlock:^(ALAsset *result, NSUInteger index, BOOL *innerStop) {
         if (someCondition) {
             *innerStop = YES;
             *outerStop = YES;
         } else {
             // process asset
         }
     }
 }

Примечания: Блок @try/@catch обычно не нужен, если у вас нет ошибок программирования внутри ваших циклов.

Ваша проверка "новых фотографий" выглядит подозрительно, потому что количество объектов в каждой группе сравнивается с одним и тем же числом self.numberOfPhotosInSavedPhotos, возможно, вам следует проверить эту часть еще раз.

person Martin R    schedule 01.04.2013