2010-12-01 3 views
0

Je veux poster un message et une photo sur Twitter (en utilisant un hébergeur d'images). Si l'utilisateur entre seul un message, puis appuie sur Envoyer, ma superposition apparaît et affiche "Envoyer un message à Twitter". Si l'utilisateur ajoute une image, elle ne l'affiche pas. Peut-être parce qu'il doit le convertir en jpg et quelle charge lourde? Mon code ressemble à ceci:iPhone: L'écran ne se redessine pas lorsque je fais quelque chose de lourd _afterwards_

[overlayMessage changeTextTo:NSLocalizedString(@"keySendTwitter", nil)]; 
overlayMessage.hidden = NO; 
overlayMessage.locked = YES; 

// I've added these out of desperation :P 
[overlayMessage setNeedsDisplay]; 
[self.view setNeedsDisplay]; 

[self sendMessage]; 

Il semble que les deux messages (changeTextTo: et sendMessage :) sont en cours d'exécution en parallèle et que sendMessage est un peu plus rapide avec faire le chargement lourd. Mais cela nécessiterait un threading et mon application n'est pas multithread.

Ou peut-être setNeedsDisplay: le mauvais message est-il de mettre à jour l'écran avant le chargement lourd?

Répondre

1

Pas 100% clair ce que vous faites, mais il semble que votre méthode [self sendMessage] bloque l'interface utilisateur de la mise à jour. Ce qui est logique si vous faites une grande opération de réseau synchrone ou une conversion d'image. Vous n'avez pas à trop vous tromper avec le filetage pour que l'interface utilisateur soit réactive pendant les opérations lourdes. il suffit d'appeler sendMessage sur un thread différent avec:

[self [email protected](sendMessage) withObject:nil afterDelay:0.001f]; 

ou

[self performSelectorInBackground:@selector(sendMessage) withObject:nil]; 

Votre méthode prendra fin, votre interface utilisateur mettra à jour (pas besoin de setNeedsDisplay, probablement) et votre sélecteur sendMessage se déclenche. Vous êtes en charge de faire en sorte sendMessage cause votre écran de chargement à rejeter, mais vous pensez à quelque chose pour que :)

L'idée clé ici est que les mises à jour de l'interface se produisent en lots. Un peu de votre code s'exécute, puis l'interface se met à jour ... un autre bit de votre code s'exécute, et l'interface se met à jour.

Qu'est-ce qui se passe ici, c'est que votre code est trop volumineux, et l'interface utilisateur ne peut pas mettre à jour jusqu'à ce que ce soit fait. Appeler setNeedsDisplay ne fait que marquer une vue comme "sale" et nécessite un redessin, elle ne redessine pas réellement la vue.

Je suggère soit de casser votre opération en morceaux asynchrones, d'utiliser NSOperationQueue, soit d'utiliser l'une des variantes performSelector.

+0

Je sais que performSelector. Mais le code de sendMessage provient de ShareKit. Ce n'est pas fait en pensant à l'esprit: P – david

+0

donc il plante quand vous utilisez performSelector? –

+0

Je suppose que votre vrai problème est l'opération de redimensionnement de l'image. ShareKit effectuera des opérations réseau asynchrones. Y at-il un moyen de le faire à l'avance, ou en arrière-plan avec NSOperationQueue? Dans mes applications photo, j'ai un NSOperationQueue traitant toutes les nouvelles photos dans une vignette et une image d'écran (avec le haut rez) –

Questions connexes