2010-04-24 1 views
1

Я создаю приложение Cocoa, которое должно будет выполнить команду rails. Эта команда генерирует вывод и передает его на stdout. Я хочу показать этот вывод пользователю в NSTextView (так что базовый поток stdout - NSTextView). Мое приложение не должно «зависать», когда выполняется команда (например, команда git занимает много времени, чтобы завершить загрузку). Мне все равно, как я должен запускать эту команду, пока я могу установить рабочий каталог.Поместите `stdout` в` NSTextView` при запуске команды

Использование рамки Ruby для Cocoa не является вариантом, так как мне также нужно сделать это для нерубинных команд, таких как git.

Может ли кто-нибудь мне помочь? Спасибо

ответ

2

Вам нужно будет использовать класс NSTask.

NSTask  * task; 
NSPipe  * pipe; 
NSFileHandle * fileHandle; 

task  = [ [ NSTask alloc ] init ]; 
pipe  = [ NSPipe pipe ]; 
fileHandle = [ pipe fileHandleForReading ]; 

[ fileHandle readInBackgroundAndNotify ]; 
[ task setLaunchPath: @"/bin/ls" ]; 
[ task setStandardOutput: pipe ]; 
[ task setStandardError: pipe ]; 
[ task launch ]; 

Затем вы можете использовать дескриптор файла для получения стандартного вывода.
Рабочий каталог может быть установлен с помощью метода setCurrentDirectoryPath.
Аргументы могут быть установлены с помощью setArguments метод.

0

Если вам нужно использовать данные во время чтения, используйте подход с NSNotification, который описан в this post на cocoabuilder.com.

В основном это настраивает NSPipe объекта, соединяющий стандартный вывод о NSTask к трубе и прослушивает NSFileHandleReadToEndOfFileCompletionNotification трубы, чтобы обработать данные, которые были толкаемыми к трубе.