需要有关 ALAssetsLibrary 枚举的帮助

Posted

技术标签:

【中文标题】需要有关 ALAssetsLibrary 枚举的帮助【英文标题】:Need assistance regarding ALAssetsLibrary enumeration 【发布时间】:2014-04-25 04:59:14 【问题描述】:
[aLib  enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetsGroupEnumerationBlock failureBlock:failureBLock];

这个方法枚举每个组,我想枚举第一组,然后我想打破它。我的目的是请求允许 ios 首次弹出。我没有做任何额外的工作,我在块中有通知,通知和触发其他必需的功能。但是多组枚举多次触发通知,我想停止。

这是我的带有停止参数的枚举块

void(^assetsGroupEnumerationBlock)(ALAssetsGroup*, BOOL*) = ^(ALAssetsGroup *groups, BOOL *stop) 
    *stop = YES;
    NSDictionary *alAuthDict = @@"alAssetsAuthStatusDictKey" : [NSString stringWithFormat:@"%ld",[self getALAssetAuthorizationStatus]];
    [[NSNotificationCenter defaultCenter]postNotificationName:@"alAssetsStatusNotificationName" object:nil userInfo:alAuthDict];
;

但是通知被调用了两次,我在控制台中看到了两次nslog

【问题讨论】:

【参考方案1】:

使用stop参数:

[lib enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
    *stop = YES;
    if (group) 
        NSDictionary *alAuthDict = @@"alAssetsAuthStatusDictKey" : [NSString stringWithFormat:@"%ld",[self getALAssetAuthorizationStatus]];
        [[NSNotificationCenter defaultCenter]postNotificationName:@"alAssetsStatusNotificationName" object:nil userInfo:alAuthDict];
    
 failureBlock:^(NSError *error) 
    // denied
];

【讨论】:

我正在使用停止参数,请查看我的问题中的编辑。 从一开始就包括在内会很有帮助。 why if(group)... when *stop 设置为 YES,表示停止,表示不应该再枚举。 它是异步的,所以它可能同时处理多个组。即使您告诉它停止,并非所有线程都会立即停止,因此您会收到额外的调用。另一种选择是添加一个计数器并仅在第一次发布通知。或者尝试将ALAssetsGroupAll 更改为单个特定组,例如ALAssetsGroupLibrary 非常感谢您的精彩回复 :)。

以上是关于需要有关 ALAssetsLibrary 枚举的帮助的主要内容,如果未能解决你的问题,请参考以下文章

ALAssetsLibrary 获取相机胶卷

打破照片 ALAssetsLibrary 的迭代

iOS系统相册的有关操作

ALAssetsLibrary 在将新照片添加到相机胶卷后返回相同的资产 - 目标 c

有关mysql索引

ALAssetsLibrary addAssetsGroupAlbumWithName 不适用于 iOS 9