2009-08-23 4 views

Répondre

4

Pourquoi ne pas utiliserde NSFileHandleà la place? De cette façon, votre code ne s'exécute que lorsque quelque chose se passe réellement dans le fichier.

+0

Je ne pouvais pas trouver une méthode appelée readDataInBackgroundAndNotify, mais j'ai trouvé readInBackgroundAndNotify. J'ai essayé ce code: http://pastie.org/592668 et le sélecteur n'est jamais appelé pour une raison quelconque. Je sais à coup sûr que le fichier est en cours de mise à jour. Des idées? – indragie

+0

Tout d'abord, vous vous inscrivez pour le mauvais nom de notification. Vous devez observer pour 'NSFileHandleReadCompletionNotification', pas' @ "NSFileHandleReadCompletionNotification" '. Ensuite, essayez de définir le descripteur de fichier du descripteur de fichier comme non bloquant en utilisant 'fcntl'. Voir http://developer.apple.com/documentation/Darwin/Reference/ManPages/man2/fcntl.2.html. –

+1

+1 pour trouver une méthode qui n'a pas besoin d'interroger - beaucoup mieux que ma propre réponse :) – Tim

0

Vous pouvez créer une instance de NSTimer et la faire appel, toutes les X secondes, à une autre méthode chargée de lire le fichier et de mettre à jour votre barre de progression. Cette méthode peut utiliser le stringWithContentsOfFile: de NSString pour lire le fichier dans une chaîne, puis l'analyser de manière appropriée.

Par exemple:

// Create the invocation of the method to call 
NSUInteger X = 2; // Change depending on how often you want the timer fired 
NSMethodSignature *signature = [self methodSignatureForSelector:@selector(read)]; 
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 

// Create the timer, adding it to the default run loop 
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:X 
               invocation:invocation 
               repeats:YES];

Et plus tard, vous définissez le sélecteur read:

- (void)read { 
    NSString *fileContents = [NSString stringWithContentsOfFile:@"aFile.txt"]; 
    NSArray *lines = [fileContents componentsSeparatedByString:@"\n"]; 
    NSString *lastLine = [lines lastObject]; 

    // Your own parsing and updating code here 
}

Si vous avez besoin d'un point d'arrêt définitif, vous pouvez stocker timer dans un Ivar dans votre classe, puis appelez [timer invalidate]; chaque fois que votre code d'analyse à l'intérieur read détermine que vous avez terminé avec le processus que vous exécutez.

docs pertinents:

+0

Merci pour la réponse, je vais essayer cela – indragie

Questions connexes