Muszę używać NSTask synchronicznie, jednak okazjonalnie moje zadanie zawiesza się w ramach polecenia "waitUntilExit". Zastanawiam się, czy istnieje pełen wdzięku sposób - metoda obsługi błędów - aby zakończyć zawieszone zadanie, aby ponownie uruchomić inny?Wiszące NSTask za pomocą waitUntilExit
Odpowiedz
Można uruchomić zadanie przy użyciu -[task launch]
, a następnie okresowo odpytywać na jego właściwości isRunning
, aby sprawdzić, czy zostało już zakończone. Jeśli nie zakończyło się po określonym czasie, możesz zadzwonić pod numer -[task terminate]
, aby go zakończyć. Wymaga to, aby uruchomione zadanie nie ignorowało sygnału SIGTERM.
Jeśli jednak odpytywanie w przypadku zakończenia zadania jest zbyt nieefektywne w twoim przypadku, po uruchomieniu zadania możesz skonfigurować źródło wysyłki typu DISPATCH_SOURCE_TYPE_PROC
. To źródło następnie asynchronicznie nazywa swój blok przypadku, gdy zadanie kończy:
dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, task.processIdentifier, DISPATCH_PROC_EXIT, dispatch_get_main_queue());
pamiętać, że jeśli zadanie jest uruchamiane poprzez NSTask
wypełnia rurę wyjściową wówczas proces będzie powiesić, skutecznie blokując waitUntilExit
z powrotem.
Można zapobiec tej sytuacji poprzez wywołanie
[task.standardOutput.fileHandleForReading readDataToEndOfFile];
przed wywołaniem
[task waitUntilExit];
Spowoduje dane rury wyjściowego należy czytać dopóki proces pisania do rury wyjścia zamyka go.
Przykład kodu wykazując problemu i różne rozwiązania:
Awesome! Dzięki za wskazanie tego - zaoszczędziło mi mnóstwo czasu na czekanie na wiszącą rurę. – Jay