2017-08-24 2 views
-2

J'ai une méthode appelée plusieurs fois. Mais je n'ai besoin d'agir que dans le dernier appel de méthode. J'ai essayé dispatch_async mais n'a pas fonctionné parce que la file d'attente est toujours été les appels:Objective-C: Attente de la dernière méthode d'appel

-(void)doingSomething:(NSString*)someValue 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [NSThread sleepForTimeInterval:1.0f]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // do something with the last call 
     }); 
    }); 
} 

Ceux d'entre vous connaît un moyen de la file d'attente les appels et utiliser uniquement le dernier appel?

Je vais vraiment apprécier votre aide

+0

vous voulez attendre le dernier appel whatSomething ou que voulez-vous dire. J'ai peur je ne comprends pas du tout –

+0

[Mettre en œuvre un motif coalesced débités dans Cocoa Touch comme layoutsubviews] (https://stackoverflow.com/q/28153632) –

Répondre

2

Ma suggestion serait d'utiliser un dispatch_group. Appelez dispatch_group_enter avant d'appeler dispatch_async, et appelez dispatch_group_leave et la fin du bloc qui est exécuté par dispatch_async. Ensuite, après avoir mis en file d'attente tous les blocs, utilisez dispatch_group_notify pour planifier le bloc d'achèvement, qui sera exécuté après que tous les autres blocs dispatch_async auront terminé.

dispatch_group_t group = dispatch_group_create(); 

for (...) { 
    dispatch_group_enter(group); 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     ... 
     dispatch_group_leave(group); 
    }); 
} 

dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
    // This gets called when all the other blocks have finished 
}); 

Alternativement, vous pouvez utiliser un NSOperationQueue au lieu de libdispatch, et de faire une opération d'achèvement qui énumère toutes les autres opérations comme une dépendance. Cela présente l'inconvénient que l'opération d'achèvement ne sera pas exécutée dans la file d'attente principale.

NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{ 
    // This gets called when all the other operations have finished 
}]; 

for (...) { 
    NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ 
     ... 
    }]; 

    [completionOperation addDependency:operation]; 
    [operationQueue addOperation:operation]; 
} 

[operationQueue addOperation:completionOperation]; 
+0

Comment NSOperationQueue utilise-t-il seulement le dernier appel à la méthode? – user2924482

+0

J'ai ajouté un exemple basé sur 'NSOperationQueue' en tant que modification. –

+0

De vos deux exemples. Tous les appels à la méthode seraient exécutés. En regardant dans votre exemple d'implémentation, comment le dernier appel est-il le seul exécuté? – user2924482