2010-10-21 30 views
0

J'ai utilisé NSOperationQueue dans mon application iPhone avant dans iPhone OS 3.0, mais maintenant dans iOS 4.0, le code ne fonctionne pas correctement. Il fonctionne correctement qu'une seule fois et sur tous les appels suivants, cela ne fonctionne pas. Y a-t-il eu des changements dans NSOperationQueue dans iOS 4.0?Pourquoi mon NSOperationQueue ne se comporte-t-il pas correctement dans iOS 4.0?

Le code correspondant est le suivant:

- (void) starteffectFunction { 

     NSOperationQueue *queue = [NSOperationQueue new]; 
     NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(starteffectProcessing) 
                        object:nil]; 

     [queue addOperation:operation]; 
     [operation release]; 
     [queue release]; 
     [spinner startAnimating]; 
} 

    -(void) starteffectProcessing{ 
    some code executes. code snippet. A 
    ...... 
    this code is note supposed to execute before A completes. But this executes before A. 
    } 
+1

Veuillez expliquer "ne fonctionne pas". Est-ce qu'il plante ou ne fait rien du tout, obtenez un avertissement, et un message d'erreur, un autre indice? – DarkDust

+0

Non, il n'y a pas d'avertissement, d'erreur, pas de crash. Ce que je fais est de créer une nsoperationqueue et d'exécuter une fonction. Et je montre un spinner jusqu'à ce que cette opération se termine. Cela fonctionne bien la première fois, mais la deuxième fois. Le code qui est censé s'exécuter après la fin de nsoperationqueue s'exécute avant la fin de l'opération nsoperation. – nishantcm

+0

Pourquoi ne pas nous donner un extrait de code? – tia

Répondre

2

Vous créez un NSOperationQueue, en ajoutant une opération à elle, puis en relâchant la file d'attente. Ce n'est pas ainsi que NSOperationQueues a été conçu pour fonctionner. Une NSOperationQueue est supposée persister, en y ajoutant des opérations si nécessaire.

Cela échoue probablement parce que vous libérez NSOperationQueue avant qu'il ait une chance de déclencher un thread pour votre opération. Peut-être que sur les anciennes versions de système d'exploitation, il était juste capable de le faire en raison d'un peu de timing.

Je recommande d'allouer la file d'attente de traitement d'effet lorsque vous en avez besoin ou lors de l'initialisation de votre objet contrôleur, puis de la conserver en tant que variable d'instance de votre objet contrôleur. Cette file d'attente sera désallouée en même temps que votre objet contrôleur, mais vous voudrez probablement annuler toutes les opérations en cours à ce moment-là et utiliser la méthode –waitUntilAllOperationsAreFinished de NSOperationQueue pour vous assurer que vous avez terminé tous les travaux avant l'allocation.