Ma bibliothèque expose 2 API comme suit pour:Obliger l'ordre d'exécution à l'aide dispatch_sync
-(void) createFile{
dispatch_sync(queueSerial, ^{ //B1
[fileObj createFileInfo:file completion:^(NSError *error){
//execute completion block C1
}];
});
}
-(void) readFile:(NSData*)timeStamp{
dispatch_async(queueSerial, ^{ //B2
[fileObj readFileInfo:fileName completion:^(NSError *error) {
dispatch_async(queueSerial2, ^{
//execute completion block C2
});
}]
});
}
Les deux readFile
et createFile
sont des méthodes asynchrones.
Je recommande généralement aux personnes utilisant ma bibliothèque d'appeler createFile
avant readFile
. Cependant, il n'y a aucune garantie que les appelants finiront par l'implémenter. Il obtient habituellement invoqué de la manière suivante (et je aucun contrôle sur cette)
[fileClass createFile];
[fileClass readFile:timeStamp];
Ce que je veux faire est d'assurer readFile
est appelée après la completion block C1
est exécutée. Je ne veux pas non plus bloquer le thread principal avec createFile
(mais cette attente peut être assouplie). Donc ce que je veux atteindre comme résultat final est:
- appelant (que je ne contrôle pas) appelle
createFile
et immédiatement après les appelsreadFile
createFile
exécute complètement, bloc d'achèvementC1
est congédié et après que,readFile
est expédiée pour faire ce que vous voulez.
Comment puis-je y parvenir?
@Rob merci pour la perspicacité.Je suis un jeune débutant (en Obj. C) à ce stade donc je vais essayer de suivre votre suggestion désormais. – ExceptionHandler
Comment 'readFile' renvoie-t-il les données qu'il a lues? Il est défini pour renvoyer 'void', donc il doit utiliser un gestionnaire de fin ou un modèle de délégué? – Rob
@Rob 'readFile' transmet les données (valeur d'erreur le cas échéant) dans le gestionnaire de complétion C2. Je ne savais pas si ces parties étaient pertinentes. – ExceptionHandler