Est les enumerateGroupsWithTypes de ALAssetsLibrary: usingBlock: failureBlock: « cassé » dans iOS 4.3.4?
-
25-10-2019 - |
Question
Je développe une application iOS qui est basé sur ALAssetsLibrary api (disponible depuis 4.0), je l'utilise pour récupérer toutes les images et les vidéos enregistrées sur l'appareil et il a été assez simple de le faire. Quoi qu'il en soit, 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 fetching ne fait rien! Le code est le suivant (et il fonctionne très 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, parce qu'aucun de mes blocs sont exécutés ... et aucune erreur est élevé! Pourquoi? Que puis-je faire?
ps: j'ai essayé de changer l'argument "types", mais ce n'est pas le problème
La solution
I don't understand why (Apple in this moment I'm hating you!), but ALAssetsLibrary in iOS 4.3.4 does not allow fetching in a background thread (I was running a series of NSOperations
in a NSOperationQueue
).
I solved by creating a little wrapper using performSelectorOnMainThread
.
EDIT:
After a code refactoring and the upgrade to iOS 5, I finally realized that the problem is actually related to how ALAssetsLibrary works, there is no need to use performSelectorOnMainThread
. I wrote a post on it here.
Autres conseils
Something very important:
The user must allow location services for your app.
As written in apple doc for enumerateGroupsWithTypes:usingBlock:failureBlock method.
Special Considerations
This method will fail with error ALAssetsLibraryAccessGloballyDeniedError if the user has not enabled Location Services (in Settings > General).
Maybe you should handle this case by displaying an alert to the user.