TextField & ImageView + Threads
Bonsoir,
J'ai remarqué que pile dans les 2 méthodes thread que j'appelle, des fois le textField ne se remplie pas et l'imageView m'affiche que l'icone "loadingIcon" (qui est blanche) alors qu'elle devrait en afficher une autre.
Voici le code :
Pour le textField, il garde parfois le "Loading..." que j'envoie avant d'appeler le thread.
HuHuHu ? :why?:
Merci,
Louka
J'ai remarqué que pile dans les 2 méthodes thread que j'appelle, des fois le textField ne se remplie pas et l'imageView m'affiche que l'icone "loadingIcon" (qui est blanche) alors qu'elle devrait en afficher une autre.
Voici le code :
<br />- (void)updateFieldsWithFreeware:(NSDictionary *)freeware<br />{<br /> [usersMarkField setStringValue:NSLocalizedString(@"Loading...",nil)];<br /> [NSThread detachNewThreadSelector:@selector(showUserMark:) toTarget:self withObject:freeware];<br /> [NSThread detachNewThreadSelector:@selector(loadIcon:) toTarget:self withObject:freeware];<br />}<br /><br />- (void)loadIcon:(id)freeware<br />{<br /> NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];<br /> NSImage* _image;<br /> NSURL* _url;<br /> <br /> [iconPI startAnimation:nil];<br /> _image = [NSImage imageNamed:@"loadingIcon"];<br /> [iconView setImage:_image];<br /> <br /> _image = nil;<br /> _url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.eagle-of-liberty.com/~ifreete/%@", <br /> [freeware objectForKey:@"iconURL"]]];<br /> _image = [[NSImage alloc] initWithContentsOfURL:_url];<br /> <br /> if(!_image){<br /> _image = [NSImage imageNamed:@"error"];<br /> [iconView setImage:_image];<br /> }else{<br /> [iconView setImage:_image];<br /> [_image release];<br /> }<br /> [iconPI stopAnimation:nil];<br /> <br /> [pool release];<br />}<br /><br />- (void)showUserMark:(id)freeware<br />{<br /> NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];<br /> // ONLINE MARK<br /> NSString* _userMarkString;<br /> NSString* _URLString;<br /> <br /> _URLString = [[NSString stringWithFormat:@"%@%@%@", MEDIUMMARKURL, [freeware objectForKey:@"name"], MEDIUMMARKURLEND] stringByAddingPercentEscapesUsingEncoding:NSISOLatin1StringEncoding];<br /> <br /> if([NSString instancesRespondToSelector:@selector(initWithContentsOfURL:encoding:error:)])<br /> _userMarkString = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:_URLString] encoding:NSUTF8StringEncoding error:nil];<br /> else<br /> _userMarkString = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:_URLString]];<br /> <br /> if(![_userMarkString isEqual:@""])<br /> [usersMarkField setStringValue:[tableView checkMark:_userMarkString forImage:NO]];<br /> else<br /> [usersMarkField setStringValue:[tableView checkMark:nil forImage:NO]];<br /> [pool release];<br />}<br />
Pour le textField, il garde parfois le "Loading..." que j'envoie avant d'appeler le thread.
HuHuHu ? :why?:
Merci,
Louka
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Le truc est donc d'indiquer le changement à faire dans le threadDictionary, d'enregistrer ton controlleur pour qu'il observe les notfs de fins de thread et de faire les changements à la réception de la notif (et pas depuis le thread). La notif te permettra de récupérer le thread et donc son dictionnaire associé.
Sinon, merci pour cette indication, Renaud
Sinon oui, le changement du champ texte se fait à la réception de la notif, mais sur base du contenu du dico.
Tout bon ?