打破照片 ALAssetsLibrary 的迭代
Posted
技术标签:
【中文标题】打破照片 ALAssetsLibrary 的迭代【英文标题】:break iteration of photos ALAssetsLibrary 【发布时间】:2013-04-01 10:12:17 【问题描述】:如何通过布尔集突破 ALAssetsLibrary enumerateAssets 方法的枚举。我可以跳出循环吗?
代码:
[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)
];
【问题讨论】:
你能不能!更具体地说,您在哪里遇到困难并需要帮助?贴出相关代码有助于理解你的问题。 【参考方案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
进行比较,也许您应该再次检查该部分。
【讨论】:
以上是关于打破照片 ALAssetsLibrary 的迭代的主要内容,如果未能解决你的问题,请参考以下文章
iPhone 使用 AlAssetsLibrary 与您的应用程序自动同步照片
将照片应用程序前景化时更新 ALAssetsLibrary 的正确方法是啥?