5 votes

Est-ce que la fonction enumerateGroupsWithTypes:usingBlock:failureBlock de ALAssetsLibrary : est-il "cassé" dans iOS 4.3.4 ?

Je développe une application iOS qui est basée sur l'api ALAssetsLibrary (disponible depuis la 4.0), je l'utilise pour récupérer toutes les images et vidéos enregistrées sur l'appareil et c'est assez simple à faire. Mais dès que j'ai installé iOS 4.3.4 sur mon iPhone 4, mon code a cessé de fonctionner. La ligne qui invoque la récupération ne fait rien ! Le code est le suivant (et il fonctionne bien sur 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];

il semble que enumerateGroupsWithTypes:usingBlock:failureBlock : ne sont jamais appelés, car aucun de mes blocs n'est exécuté... et aucune erreur n'est levée ! Pourquoi ? Qu'est-ce que je peux faire ?

ps : J'ai essayé de changer l'argument "types", mais ce n'est pas le problème !

8voto

daveoncode Points 4453

Je ne comprends pas pourquoi (Apple en ce moment je te déteste !), mais ALAssetsLibrary dans iOS 4.3.4 ne permet pas la récupération dans un thread d'arrière-plan (j'exécutais une série de NSOperations dans un NSOperationQueue ). J'ai résolu le problème en créant un petit wrapper utilisant performSelectorOnMainThread .

EDIT :

Après un remaniement du code et la mise à niveau vers iOS 5, j'ai finalement réalisé que le problème est en fait lié à la façon dont ALAssetsLibrary fonctionne. performSelectorOnMainThread . J'ai écrit un article à ce sujet ici .

0voto

Vincent Zgueb Points 1193

Quelque chose de très important :

L'utilisateur doit autoriser les services de localisation pour votre application.

Comme écrit dans le document Apple pour enumerateGroupsWithTypes:usingBlock:failureBlock méthode.

Considérations particulières

Cette méthode échouera avec l'erreur ALAssetsLibraryAccessGloballyDeniedError si l'utilisateur n'a pas activé les les services de localisation (dans Paramètres > Général).

Vous devriez peut-être traiter ce cas en affichant une alerte à l'utilisateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X