5

我正在开发一个基于 ALAssetsLibrary api(自 4.0 起可用)的 iOS 应用程序,我使用它来检索保存在设备上的所有图像和视频,并且这样做非常简单。无论如何,一旦我在 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:usingBlock:failureBlock:永远不会被调用,因为我的块都没有被执行......并且没有引发错误!为什么?我能做些什么?

ps:我试图改变“类型”参数,但这不是问题!

4

2 回答 2

8

我不明白为什么(Apple 在这一刻我恨你!),但 iOS 4.3.4 中的 ALAssetsLibrary 不允许在后台线程中获取(我正在运行一系列NSOperationsin a NSOperationQueue)。我通过使用performSelectorOnMainThread.

编辑:

经过代码重构和升级到 iOS 5,我终于意识到问题实际上与 ALAssetsLibrary 的工作方式有关,没有必要使用performSelectorOnMainThread. 我在这里写了一篇关于它的文章

于 2011-07-24T12:08:51.177 回答
0

非常重要的一点:

用户必须允许您的应用使用位置服务

正如苹果文档中所写的enumerateGroupsWithTypes:usingBlock:failureBlock方法。

特别注意事项

如果用户未启用定位服务(在设置 > 常规中),此方法将失败并出现错误 ALAssetsLibraryAccessGloballyDeniedError。

也许您应该通过向用户显示警报来处理这种情况。

于 2012-01-15T18:45:50.443 回答