Vous avez besoin ce qu'on appelle un « sélecteur ».
Je vous recommande d'utiliser les appels synchrones encore - mais dans un thread séparé. La raison en est que malgré le fait d'être asynchrone, si vous transférez des données dans le thread actuel, vous rencontrerez toujours des problèmes de lenteur de l'interface utilisateur. Si vous utilisez l'indicateur d'activité réseau global, ce n'est pas un problème - mais un indicateur local pour votre application (ou toute autre image redessinée) - semblera être verrouillé.
Par conséquent, créer une classe appelée ImageDownloader (ou somesuch), et placez votre appel de téléchargement synchrone là-bas, pour saisir vos données d'image. Comme l'un des membres de votre classe, déclare (dans l'interface):
SEL successSelector;
Lorsque vous créez cette classe (que vous voulez passer dans une URL, et récupérer vos données d'image, créez une fonction d'initialisation de la forme suivante (qui prend dans un SEL), et appeler à l'aide:
[ImageDownloader alloc] initWithSelector: @"http://url string" :self : @selector(yourFunction:)
]
Fondamentalement, vous devez passer un objet, et la méthode dans cet objet, de rappeler quand son fait
La mise en œuvre « initWithSelector » ressemble à:
-(id) initWithSelector: (NSString*)url :(id)adelegate :(SEL) successSeletor {
self.url = url;
self.delegate = adelegate;
self.sel = successSelector;
}
(Notez le côlon après « yourFunction » - vous avez besoin de deux points pour chaque paramètre de votre fonction de rappel a.
Ainsi, le sig pour yourFunction ressemble:
-(void) yourFunction: (NSData*)imageData;
Pour appeler ceci de votre classe ImageDownloader (lorsque le téléchargement est terminé), il suffit d'appeler votre sélection à l'aide:
[delegate performSelector:sel withObject:imageData];
Enjoy!