2013-04-06 12 views
11

Czytam dane z NSFileHandle (ze NSPipe) stosując readabilityHandler bloku:Jak sprawdzić koniec pliku za pomocą odczytuHandler NSFileHandle?

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

Działa to dobrze, mam wszystkie dane spodziewam Fed do mojego sposobu processData. Problem polega na tym, że muszę wiedzieć, kiedy przeczytano ostatni fragment danych. availableData powinien zwrócić pustą instancję NSData, jeśli osiągnęła koniec pliku, ale problem polega na tym, że procedura obsługi osiągów nie jest ponownie wywoływana w EOF.

Nie mogę znaleźć informacji o tym, jak uzyskać powiadomienie lub oddzwonienie w EOF. Więc czego mi brakuje? Czy Apple naprawdę udostępnia asynchroniczny interfejs API do czytania bez wywołania zwrotnego EOF?

Nawiasem mówiąc, nie mogę użyć metody opartej na runloopie readInBackgroundAndNotify, ponieważ nie mam dostępnego runloopa. Jeśli nie uda mi się uzyskać tego z interfejsem API NSFileHandle, prawdopodobnie użyję źródła wysyłki do wykonania IO.

+0

Czy na pewno wszystko napisać końce rury były zamknięte? Jeśli chodzi o pętle uruchomieniowe, wszystkie wątki utworzą pętlę uruchamiania na żądanie i można uruchomić ją samodzielnie. –

+0

Tak, rura jest prawidłowo zamknięta. Zrobiłem jeszcze kilka eksperymentów i to samo dzieje się z innymi rodzajami instancji 'NSFileHandle'. Podczas odczytu ze standardowego wejścia lub zwykłego pliku nie ma również powiadomienia o EOF. – Sven

Odpowiedz

1

Obawiam się, że nie masz szczęścia, robiąc to z NSFileHandle, jeśli nie możesz użyć readInBackgroundAndNotify.

dwa rozwiązania widzę:

  1. Tworzenie runloop a następnie użyć readInBackgroundAndNotify.
  2. przewróceniu własne realizacja za pomocą dispatch_io_*