2010-12-29 1 views
2

J'ai un fil principal et un fil auxiliaire dans mon application. Le fil principal, comme tout le monde le sait, est utilisé par l'interface utilisateur. J'utilise le thread secondaire pour faire le chargement en arrière-plan de mes vues. J'ai un contrôleur principal que j'appelle un contrôleur fictif. De là, j'appelle mon contrôleur principal, qui est en mode paysage.fil secondaire concernant

Donc, fondamentalement, ce que je dois faire est, quand je tourne mon contrôleur fictif, je veux être en mesure de charger mon contrôleur paysage principal et vice versa.

Tout fonctionne correctement lorsque je tourne de faux à principal. Le principal a une série de contrôleurs enfants à charger, donc j'ai mis ce processus sur un thread secondaire, et à ce moment ils sont en train de charger je montre un écran loader.

Le mannequin est un contrôleur de vue normal et le principal est un contrôleur de vue modale.

Maintenant le problème.

Si un utilisateur essaie de faire pivoter le formulaire dummy -> main, la méthode de rotation déclenche l'initialisation du contrôleur de vue principal. Mais pour une raison quelconque, l'utilisateur change d'avis et tourne en arrière de la forme principale -> dummy idéalement, la transition devrait être lisse car le thread de l'interface utilisateur (principal theread) est libre. Qu'est-ce qui se passe est l'interface utilisateur tourne en arrière. Mais puisque le thread secondaire sur le contrôleur principal est toujours activé, même après que le contrôleur modal de rejet est appelé sur le MainController par le thread principal, lorsque nous appelons la fonction willRotate.

J'ai lu dans divers articles que nous ne pouvons pas simplement tuer le thread secondaire, car nous devons nettoyer les choses nous-mêmes. Alors quelqu'un peut-il me guider à travers le code, comment puis-je tuer mon thread secondaire et faire le nettoyage avant de revenir à mon formulaire d'appel .. ?? C'est un peu urgent ... s'il vous plaît ne pas pointer vers d'autres sujets de discussion, car j'ai déjà visité ceux-ci.

Je veux spécifiquement savoir comment devrais-je arrêter mon thread secondaire, sans provoquer un accident. merci.

-(void)viewDidLoad { 

[super viewDidLoad]; 

workingThread = [[NSThread alloc]initWithTarget:self selector:@selector(parseMainTextFile) object:nil]; 

[workingThread start]; 

[NSThread detachNewThreadSelector:@selector(addLoader) toTarget:self withObject:nil]; 
    //[self performSelectorOnMainThread:@selector(parseMainMatchTextFile) withObject:nil waitUntilDone:NO]; 

} 
+1

Que voulez-vous dire par "chargement en arrière-plan de [vos] vues"? UIKit n'est pas thread-safe (sauf dans un très petit nombre de circonstances). Il n'est pas prudent de charger vos vues sur un autre thread. –

+0

désolé le mot correct serait l'initialisation de fond de mon point de vue. – swapnil

+0

Avez-vous modifié la question? Ici, le fil de travail est mon fil secondaire. Et parseMainTextFile: est la fonction de lancement de thread. Cette méthode a une série d'autres méthodes, qui initialisent les contrôles enfants. J'espère que la scène est un peu plus claire. – swapnil

Répondre

2

En règle générale, si vous exécutez un thread d'arrière-plan, cela signifie que vous avez une boucle d'exécution qui fonctionne dans une instruction while. Vous devriez avoir un drapeau qui arrête la boucle d'exécution. De cette façon, il transformerait l'état du fil en fini.

while (mRunLoop && [mLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); 

C'est ainsi que je le fais. En outre lire ce Post et ses sous-messages à partir de commentaires. Bonne chance!

+0

Umm..Oleg merci, mais pouvez-vous juste poster un extrait montrant un scénario? Cos je ne comprends pas assez bien. – swapnil

+0

Voici comment cela fonctionne pour moi: NSRunLoop * mLoop = [NSRunLoop currentRunLoop]; Self_animationTimer = [NSTimer scheduledTimerWithTimeInterval: animationInterval target: sélecteur automatique: @selector (drawView) userInfo: nil répète: YES]; \t \t \t \t \t mRunLoop = YES; \t while (![[NSThread currentThread] isCancelled] && mRunLoop && [mode d'exécution mLoop: NSDefaultRunLoopMode beforeDate: [NSDate distantFuture]]); –

+0

umm..il y a encore une confusion .. Pourriez-vous s'il vous plaît élaborer ce qui se passe ici ?? – swapnil