AlassetSlebibrary的EnumerateGroupSwithTypes是:使用block:FailterBlock:iOS 4.3.4中的“损坏”?
-
25-10-2019 - |
题
我正在开发一个基于AlassetLibrary API的iOS应用程序(自4.0以来可用),我使用它来检索保存在设备上的所有图像和视频,并且这样做非常简单。无论如何,一旦我在iPhone 4上安装iOS 4.3.4,我的代码就停止工作。调用获取的行无济于事!该代码为以下(并且在iOS 4.3.3上正常工作):
ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];
ALAssetsGroupEnumerationResultsBlock assetsEnumerator = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
// handle asset
};
ALAssetsLibraryGroupsEnumerationResultsBlock groupsEnumerator = ^(ALAssetsGroup *group, BOOL *stop) {
// handle group
};
ALAssetsLibraryAccessFailureBlock failHandler = ^(NSError *error) {
// handle error
};
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:groupsEnumerator failureBlock:failHandler];
看起来 EnumerateGroupswithTypes:使用block:FailityBlock: 永远不会被打电话,因为我的块没有执行...也没有引起错误!为什么?我能做些什么?
PS:我试图更改“类型”参数,但这不是问题!
解决方案
我不明白为什么(这一刻我讨厌您!),但是iOS 4.3.4中的AlassetSlebibrary不允许在背景线程中获取(我正在运行一系列 NSOperations
在一个 NSOperationQueue
)。我通过使用一个小包装器来解决 performSelectorOnMainThread
.
编辑:
经过代码进行重构和升级iOS 5之后,我最终意识到问题实际上与AlassetSlebibrary的工作方式有关,无需使用 performSelectorOnMainThread
. 我在这里写了一篇文章.
其他提示
非常重要的事情:
用户必须 允许位置服务 对于您的应用。
如Apple Doc所写 EnumerateGroupswithTypes:使用block:FailityBlock 方法。
特殊考虑
如果用户尚未启用位置服务(在设置>“常规”中),则此方法将失败,而AlryAlaSsetSlectLaryAccessgloballyDeniedError。
也许您应该通过向用户显示警报来处理这种情况。
不隶属于 StackOverflow