Je souhaite exécuter quelques méthodes de mise en réseau à l'aide de NSOperation pour chacune d'elles et ajouter les opérations à une NSOperationQueue définie sur un fil arrière, je veux que les NSOperations se produisent en série.Comment utiliser NSOperationQueue et NSOperation pour appeler périodiquement des tâches de téléchargement sérialisées à l'aide d'un NSTimer en arrière-plan Thread
L'appel qui crée la file d'attente NSOperation est appelé périodiquement, toutes les 30 secondes à l'aide d'un NSTimer.
est ici un code snipped jusqu'à présent:
NSTimer *timer;
NSOperationQueue *bgQueue;
- (void)startdDownloadLoop{
if (![self.timer isValid]){
self.bgQueue = [[NSOperationQueue alloc] init];
self.timer = [NSTimer scheduledTimerWithTimeInterval:30.0
target:self
selector:@selector(updateDB)
userInfo:nil
repeats:YES];
}
}
- (void)updateDB{
// Next code was removed since si similar to the call `[self.bgQueue cancelAllOperations];`, as @robinkunde suggested
// for (NSOperation *operation in [self.bgQueue operations]) {
// if (operation.isExecuting) {
// [operation cancel];
// }
// }
[self.bgQueue cancelAllOperations];
self.bgQueue = [[NSOperationQueue alloc] init];
self.bgQueue.maxConcurrentOperationCount = 1;
NSBlockOperation *blockOp1 = [NSBlockOperation blockOperationWithBlock:^{
[NetworkManager downloadCars];
}];
NSBlockOperation *blockOp2 = [NSBlockOperation blockOperationWithBlock:^{
[NetworkManager downloadPartsForAllCars];
}];
NSBlockOperation *blockOp3 = [NSBlockOperation blockOperationWithBlock:^{
[NetworkManager downloadEachPathSpecs];
}];
[self.bgQueue addOperation:blockOp1];
[self.bgQueue addOperation:blockOp2];
[self.bgQueue addOperation:blockOp3];
}
Les méthodes NetworkManager
sont POST/GET méthodes avec les gestionnaires d'achèvement, qui après avoir terminé le téléchargement, ils économisent la date dans DB puis mettre à jour l'interface utilisateur en utilisant un notification.
Mise à jour:
Depuis la confusion, je pensais à poster ma question réelle en ce qui concerne le code: placé comme suit
1- Si l'exécution du NSOperationQueue
sera de série? 2
2 - Si j'appelle le [operation cancel]
va arrêter l'exécution de l'opération?
3 - Si j'appelle le cancelAllOperations
et que je le ré-initialise, est-ce la bonne façon d'effacer le courant NSOperationQueue
?
Il ne fera probablement pas ce que vous voulez. On peut supposer que chacune des méthodes 'download ...' s'exécute de manière asynchrone. Si c'est le cas, dès que l'opération de réseau est envoyée, alors le bloc se terminera et le prochain bloc soumis commencera à s'exécuter, même si la première opération de téléchargement n'est pas encore terminée. Il vaut probablement mieux utiliser un dispatch_group, ou encore mieux envoyer des notifications plutôt que d'interroger ce qui est cher en termes de trafic de batterie et de réseau – Paulw11
En ce qui concerne les opérations d'annulation, il appartient à chaque bloc de vérifier la propriété des blocs 'isCancelled' et cesser le travail si cela est approprié.La file d'attente d'opération ne peut pas réellement annuler une opération, elle définit simplement la propriété pour indiquer à l'opération qu'elle doit s'annuler elle-même. Voir http://stackoverflow.com/questions/8113268/how-to-cancel-nsblockoperation – Paulw11