2010-11-16 11 views
0

Nous essayons d'obtenir une tâche de fond dans le but d'inclure un indicateur d'activité dans un écran de travail. Selon notre compréhension, cela nécessite de créer un fil de fond pour l'exécuter. Je comprends également qu'aucune mise à jour de l'interface graphique ne peut être effectuée sur le thread d'arrière-plan.iPhone SDK: Comment savoir quand la tâche en arrière-plan est terminée?

Étant donné cela, voici le schéma général de ce qui doit arriver.

a.) Pré-valider les champs. Assurez-vous que l'utilisateur n'a entré aucune donnée invalide. b.) Configurez la tâche d'arrière-plan. . c) les résultats du processus de tâche de fond

C'est ce qu'il ressemble dans le code jusqu'à présent:

-(IBAction)launchtask:(id)sender 
{ 
    //validate fields 
    [self validateFields]; 

    /* Operation Queue init (autorelease) */ 
    NSOperationQueue *queue = [NSOperationQueue new]; 

    /* Create our NSInvocationOperation to call loadDataWithOperation, passing in nil */ 
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self 
                      selector:@selector(backgroundTask) 
                       object:nil]; 

    /* Add the operation to the queue */ 
    [queue addOperation:operation]; 
    [operation release]; 


    //TO DO: Add any post processing code here, BUT how do we know when it is done??? 
    ConfirmationViewController *otherVC; 

    //show confirm 
    //if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    //{ 
    // otherVC = [[ConfirmationViewController alloc] initWithNibName:@"ConfirmationViewPad" bundle:nil]; 
    //} 
    //else 
    { 
     otherVC = [[ConfirmationViewController alloc] initWithNibName:@"ConfirmationView" bundle:nil]; 
    } 

    //TO DO: Let's put this in a struct 
    otherVC.strConfirmation = strResponse; 
    otherVC.strCardType = strCardType; 
    otherVC.strCardNumber = txtCardNumber.text; 
    otherVC.strExpires = txtExpires.text; 
    otherVC.strCustomerEmail = txtEmail.text; 

    [self.navigationController pushViewController:otherVC animated:YES]; 
    [otherVC release]; 
    otherVC = nil; 


} 

Jusqu'à présent, qui fonctionne assez bien, sauf que nous n'avons pas encore un moyen de savoir lorsque la tâche d'arrière-plan est terminée. Seulement quand il est complet, pouvons-nous traiter les résultats de la tâche d'arrière-plan. À l'heure actuelle, cela ne fonctionne pas car il n'y a pas de synchronisation avec les deux. Comment résoudre? Une autre chose, a remarqué qu'un spinner est maintenant affiché dans la barre d'état. C'est une bonne chose, mais cela ne semble pas disparaître une fois la tâche terminée. Que faire?

Merci d'avance.

Répondre

0

Vos options sont, brièvement:

  • valeur de clé observer la propriété « operationCount » sur NSOperationQueue et attendez qu'il atteigne 0 (ou, ce qui revient, la propriété « opérations » et vérifier le nombre)
  • faites déclencher vos opérations une petite notification qu'ils sont terminés (probablement sur le thread principal avec performSelectorOnMainThread: ...) et attendez que le nombre correct de notifications ait été reçu.

[EDIT: Je vois que vous avez demandé spécifiquement à propos de l'ancien SDK 3.0. Dans ce cas, observez les opérations et vérifiez le compte car la propriété operationCount postdates SDK 3.0]

Il n'y a pas de système automatique pour démarrer et arrêter un spinner dans le cas général. Vous devrez en parler vous-même. Cependant, une chose intéressante à propos d'un spinner est qu'il continue à tourner même si le thread principal est bloqué, donc si vous faites du saut de thread juste pour cela, alors vous n'en avez pas vraiment besoin.

Un spinner apparaît dans la barre d'état pour afficher les extractions de données, je crois. S'il continue à tourner, vous avez toujours des demandes d'URL en cours, que vous attendiez ou non les résultats.

+0

Merci. J'ai essayé la méthode KVO en utilisant ce code ici. http://efreedom.com/Question/1-1049001/Get-Notification-NSOperationQueue-Finishes-Tasks Je reçois la notification que l'opération est terminée MAIS il se trompe avec cela. bool _WebTryThreadLock (bool), 0x885ac40: J'ai essayé d'obtenir le verrou Web à partir d'un thread autre que le thread principal ou le thread Web. Cela peut être le résultat d'un appel à UIKit à partir d'un thread secondaire. Crashing now ... Si cela fait une différence dans le thread d'arrière-plan, je fais un appel ASIHTTPRequest synchrone. – butchcowboy

+0

Que faites-vous lorsque vous recevez la notification KVO? Fais-tu quelque chose UIKit là-bas? – Tommy