我正在爲Mac上的Adobe Premiere編寫一個插件,它打開一個外部應用程序,然後使用NSPipe和NSFileHandle從外部應用程序讀取標準輸出。我知道推薦的方式來做到這一點涉及或者使用NSNotificationCenter與NSFileHandle的讀取背景沿並通知命令,或使用NSFilehandle的setReadabilityHandler方法一次讀取輸出線到達:NSFileHandle在沒有調試器的情況下運行時表現奇怪 - 一些NSRunLoop問題?
NSTask appTask... // my task which is launching the external app
NSPipe* myPipe = [[NSPipe alloc] init];
[appTask setStandardOutput:[myPipe fileHandleForReading]];
[[myPipe fileHandleForWriting] setReadabilityHandler:^(NSFileHandle *file) {
NSData* dataRead = [file availableData];
if (dataRead != nil) {
printf("Read a line\n");
}
}];
當我使用附帶的調試器從Xcode啓動Premiere時,此工作正常。但是,當我自己運行Premiere時,如果外部應用程序在其標準輸出中放置了一行,則塊(或通知如果使用該方法)不會被調用。我假設有一種奇怪的方式,當它運行通過Xcode時,其運行的線程有一個運行循環,當插件從Premiere自行運行時啓動時,運行循環不會活動。
我可以解決這個問題的一種方法是隻需要一個循環,每秒鐘檢查幾次,是否有任何東西需要從管道的後臺線程中運行的NSFileHandle中讀取。但是,我發現沒有辦法檢查是否有某些東西需要從NSFileHandle中讀取,除非有一些準備好的東西(即使有些東西準備好了,而不是通過Xcode啓動時,由於某種原因,阻塞只是保持阻塞狀態)。
所以我希望有兩種解決方案之一: 1)某種方法可以糾正NSRunLoop的錯誤,即在管道的NSFileHandle中準備好某些東西時,通知/回調塊不會被觸發。或者 2)一些方法來檢查是否有東西準備好在管道的NSFileHandle中讀取,而不會阻塞,直到準備好讀取某些東西。
感謝您的任何幫助!