Lors de la commutation vue sur la barre de navigation, comment quitter en toute sécurité sans fil NSOperationQueue erreur EXC_BAD_ACCESS

StackOverflow https://stackoverflow.com/questions/2003445

  •  18-09-2019
  •  | 
  •  

Question

J'utilise un UITableView pour afficher des messages de chaîne, et j'utilise NSOperationQueue de tenir un NSOperation personnalisé qui fetchs un message en fil d'arrière-plan. Après un message de succès alla chercher, NSOperation personnalisé informera le contrôleur de UITableView pour le montrer.

Si je clique de nouveau bouton dans la barre de navigation pour passer du UITableView à autre point de vue après tout un message chargé, tout est OK. Mais, si je clique sur le bouton de retour alors que certains messages chargement encore, un EXC_BAD_ACCESS est un jet. J'ai vérifié que l'exception a eu lieu en NSOperation personnalisé notification contrôleur UITableView avec la méthode performSelectorOnMainThread. Sound comme le contrôleur de UITableView cible n'est pas invalide après vue commuté, mais je pense que le contrôleur de navigation tiendra la vue instance du contrôleur. Puis-je savoir comment résoudre ce problème? Merci.

opération personnalisée est initialisé dans le contrôleur de UITableView avec le code suivant:

StatusMessageLoadingOperation *operation = [[StatusMessageLoadingOperation alloc] 
                                            initWithData:person
                                            messageArray:cachedStatusMessages
                                            target:self 
                                            action:@selector(didFinishStatusMessages:)];
[operationQueue addOperation:operation];
[operation release];

La classe NSOperation personnalisée mettra à jour UITableView avec le code suivant:

- (void)main{
    for (int i = 0; i < [[person statusMessages] count]; i++) {
        [target performSelectorOnMainThread:action withObject:messageArray waitUntilDone:NO];
    }
}
Était-ce utile?

La solution

Avez-vous essayé d'appeler [operationQueue cancelAllOperations] dans votre méthode viewWillDisappear?

Autres conseils

Parce que popping un contrôleur de vue appelle la méthode -dealloc de ce contrôleur, vous pouvez divulguera votre file d'attente trop tôt, et une autre partie de votre application tente d'accéder à la file d'attente ou d'une opération à l'intérieur qui n'existe plus.

Ma recommandation est de mettre votre instance NSOperationQueue *myQueue dans votre délégué de l'application.

Utilisez le -applicationDidFinishLaunching: de délégué de l'application et les méthodes -dealloc pour initialiser et libérer la file d'attente et son contenu.

En séparant votre file d'attente du contrôleur de vue, la file d'attente ne sera pas libérée lorsque vous allez en retirer un contrôleur de vue depuis votre pile de navigation. Et toutes les autres opérations devraient encore être à la disposition du reste de l'application.

Pour faciliter l'accès à la file d'attente, mettre en place la définition macro suivante:

#define UIAppDelegate ((MyAppDelegate *)[UIApplication sharedApplication].delegate)

Vous pouvez ensuite utiliser la macro pour accéder à votre file d'attente comme suit, par exemple:.

NSLog(@"%@", [[UIAppDelegate myQueue] operations]);

Ou, par exemple:

[[UIAppDelegate myQueue] addOperation:myOperation];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top