2011-06-27 3 views
0

Bon, maintenant je faisais une application mobile comme viseur de restaurant, je veux montrer une photo du restaurantcomment faire un multithreading simple?

l'exemple: restaurant x <image x>

Il est un code:

if (ImageToDisplay != nil) 
{ 
    NSData * imageData = [[[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: ImageToDisplay.URL]]autorelease]; 
    ImageForRestaurant.image = [UIImage imageWithData: imageData]; 
} 

Le problème est ce processus de téléchargement d'images peut prendre trop de temps. Je veux donc que le processus soit exécuté sur un thread différent. De cette façon, le code après cela peut fonctionner sans avoir à attendre que celui-ci se termine.

Comment puis-je le faire?

Répondre

3
if (ImageToDisplay != nil) { 
    [self performSelectorInBackground:@selector(loadImage:) object:ImageToDisplay]; 
} 

- (void)loadImage:(ImageToDisplay *)image { //Background method 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSData * imageData = [[[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: ImageToDisplay.URL]]autorelease]; 
    [self performSelectorOnMainThread:@selector(setImageForRestaurant:) withObject:imageData waitUntilDone:NO]; 
    [pool release]; 
} 

- (void)setImageForRestaurant:(NSData *)imageData { //Change UI in main thread 
    ImageForRestaurant.image = [UIImage imageWithData: imageData]; 
} 

Je viens d'inclure des notions de base dans le multi-threading; Je suppose que cela servira votre but

+0

à quoi sert la version automatique de loadImage? –

+0

Il n'y a pas de classe appelée ImageToDisplay –

+0

pourquoi ce code: [self performSelectorInBackground: @selector (loadImage :) loadImage: ImageToDisplay]; ne fonctionne pas. J'ajoute NSTread à l'en-tête mais l'en-tête est introuvable. pouvez-vous me donner un cadre de NSTread? est-il besoin de NSTread.h? –

2

Utilisez la bibliothèque ASIHTTPRequest. Voir « Création d'une requête asynchrone » sur cette page: http://allseeing-i.com/ASIHTTPRequest/How-to-use

Aussi la nouvelle bibliothèque AFNetworking semble prometteur. Comme ils disent:

Si vous êtes fatigué de bibliothèques massives qui essaient d'en faire trop, si vous avez pris sur vous de rouler votre propre solution hacky, si vous voulez une bibliothèque qui rend effectivement le réseau iOS code un peu amusant, essayez AFNetworking.

+1

@Armen [re: modifier] Je pense que l'URL est plus descriptive que "cette page". Il est sémantiquement correct et informatif. – Ross

2

Avez-vous essayé

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg

Je pense qu'il est la meilleure façon.