2010-08-13 4 views
0

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?

+0

Votre callback n'a pas d'argument de contexte pour passer votre instance? – Nyx0uf

Répondre

2

Si vous n'êtes pas inquiet à propos de la prise en charge antérieure à iOS 4.0, consultez Grand Central Dispatch. Vous pouvez faire un bloc ou un pointeur de fonction en ligne avec le contexte capturé. Ensuite, vous créez une nouvelle file d'attente avec GCD, et il gérera tout le thread pour vous. Faites juste votre bloc appel ce que vous voulez une fois que vous avez terminé.

Tous les blocs se souviennent du contexte à partir duquel ils ont été créés. Les meilleurs exemples d'utilisation de GCD peuvent être trouvés dans la section OS principale des vidéos WWDC.

C'est la méthode que j'utilise pour effectuer presque tous les travaux de filetage de nos jours.

Questions connexes