Является ли ALAssetsLibrary enumerateGroupsWithTypes: usingBlock: failBlock: «сломан» в iOS 4.3.4? - PullRequest
5 голосов
/ 24 июля 2011

Я занимаюсь разработкой приложения для iOS на основе API ALAssetsLibrary (доступно с версии 4.0), использую его для извлечения всех изображений и видео, сохраненных на устройстве, и это было довольно просто сделать. В любом случае, как только я установил iOS 4.3.4 на свой iPhone 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: failBlock: никогда не вызывается, потому что ни один из моих блоков не выполняется ... и не возникает ошибка! Зачем? Что я могу сделать?

ps: я пытался изменить аргумент "types", но это не проблема!

Ответы [ 2 ]

8 голосов
/ 24 июля 2011

Я не понимаю, почему (Apple в данный момент ненавижу вас!), Но ALAssetsLibrary в iOS 4.3.4 не позволяет извлекать в фоновом потоке (я запускал серию NSOperations в NSOperationQueue).Я решил создать небольшую оболочку, используя performSelectorOnMainThread.

EDIT:

После рефакторинга кода и обновления до iOS 5 я наконец понял, что проблема на самом деле связана с тем, как работает ALAssetsLibrary, нет необходимости использовать performSelectorOnMainThread. Я написал пост здесь .

0 голосов
/ 15 января 2012

Что-то очень важное:

Пользователь должен разрешить службы определения местоположения для вашего приложения.

Как написано в Apple Doc для enumerateGroupsWithTypes: usingBlock: failBlock *Метод 1008 *.

Особые замечания

Этот метод завершится ошибкой с ошибкой ALAssetsLibraryAccessGloballyDeniedError, если пользователь не включил службы определения местоположения (в меню «Настройки»> «Общие»).

Возможно, вам следует разобраться с этим делом, отобразив предупреждение для пользователя.

...