Je reçois des données dans une fonction de rappel pour écrire séquentiellement sur le disque, environ 4 Ko toutes les 0,02 secondes. Si je fwrite()
du thread la fonction de rappel est dedans, je reçois un peu de retard dans d'autres parties de code dans le même fil. Donc, afin de ne pas bloquer ce thread lors de l'écriture sur le disque, je veux déplacer le code fwrite vers un autre thread. Le problème est que la fonction de rappel n'a pas de portée d'instance, donc je suis limité à appeler des fonctions statiques ou des méthodes de classe. Les données que je veux écrire appartiennent à l'instance.Comment effectuer l'écriture de fichier séquentiel dans un thread séparé
Quels choix ai-je? J'ai essayé NSOperationQueue avec blocs:
void (^ioBlock)(void) = ^{
fwrite(saveBuffer, length * 4, 1, file);
};
FileSaveOperation *op = [[FileSaveOperation alloc] initWithBlock:ioBlock];
[opQueue addOperation:op];
[op release];
En FileSaveOperation je mis en place la piscine:
- (void)main
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[NSRunLoop currentRunLoop];
block();
[pool release];
}
Mais cela me donne cette erreur:
_NSAutoreleaseNoPool(): Object 0x33ad20 de classe __NSFastEnumerationEnumerator auto-libéré sans pool en place - juste fuite
Je ne peux pas utiliser performSelector:onThread:
car je ne peux pas accéder à l'instance. Dois-je rendre mon membre de données statique? Y a-t-il une meilleure solution?
Votre callback n'a pas d'argument de contexte pour passer votre instance? – Nyx0uf