2013-04-06 17 views
11

Ich lese Daten aus einem NSFileHandle (von NSPipe) unter Verwendung eines readabilityHandler Block:Wie nach End-of-File mit NSFileHandle LesbarkeitHandler?

fileHandle.readabilityHandler = ^(NSFileHandle *handle) { 
    [self processData: [handle availableData]]; 
} 

Dies funktioniert gut, ich alle Daten, erreiche ich meine processData Methode gefüttert erwarten. Das Problem ist, dass ich wissen muss, wann der letzte Datenblock gelesen wurde. availableData sollte eine leere NSData Instanz zurückgeben, wenn es das Dateiende erreichte, aber das Problem ist, dass der Erreichbarkeitshandler nicht erneut bei EOF aufgerufen wird.

Ich kann nichts über eine Art von Benachrichtigung oder Rückruf auf EOF finden. Also was fehlt mir? Liefert Apple eine asynchrone Lese-API ohne EOF-Callback?

Übrigens kann ich nicht die Runloop basierte readInBackgroundAndNotify Methode verwenden, da ich keinen Runloop verfügbar habe. Wenn ich das nicht mit der API NSFileHandle arbeiten kann, werde ich wahrscheinlich direkt eine Versandquelle verwenden, um die IO zu tun.

+0

Bist Du sicher alle Enden des Rohres schreiben geschlossen worden sind? In Bezug auf Run-Loops erstellen alle Threads bei Bedarf eine Run-Schleife, und Sie können selbst eine Run-Schleife ausführen. –

+0

Ja, das Rohr ist richtig geschlossen. Ich habe etwas mehr experimentiert und dasselbe passiert auch mit anderen Arten von 'NSFileHandle'-Instanzen. Beim Lesen von der Standardeingabe oder einer regulären Datei gibt es auch keine Benachrichtigung für EOF. – Sven

Antwort

1

Ich fürchte, Sie haben kein Glück dabei mit NSFileHandle tun, wenn Sie readInBackgroundAndNotify nicht verwenden können.

Zwei Lösungen, die ich sehe:

  1. eine Runloop erstellen und dann readInBackgroundAndNotify verwenden.
  2. Rolle eine eigene Implementierung mit dispatch_io_*