別の方法で尋ねるには:
たとえば、git リポジトリのクローンを作成すると、端末の出力は次のようになります。
Cloning into '/users/whatever'...
remote: Counting objects: 1764, done.
remote: Compressing objects: 100% (909/909), done.
remote: Total 1764 (delta 944), reused 1622 (delta 820)
Receiving objects: 100% (1764/1764), 395.83 KiB | 139 KiB/s, done.
Resolving deltas: 100% (944/944), done.
しかし、Cocoa アプリからまったく同じコマンドを実行すると、次のようにしか出力されません。
Cloning into '/users/whatever'...
どちらのタスクも実行されるだけで、その仕事をします。前者のユーザーに進行状況を表示できないという私の唯一の問題。
私の元の質問:
以下のように、Cocoa で NSTask と NSPipe を使用して同期「端末コマンド」を問題なく実行できます。
-(NSString*)execute:(NSString*) command
{
NSTask *task = [NSTask new];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:[NSArray arrayWithObjects:@"-c", command, nil]];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
[task setStandardError:pipe];
[task launch];
NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile];
[task waitUntilExit];
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
しかし、「継続的に更新される」出力 (「git clone」などを考えてください) を持つタスクを起動すると、完全な出力フローを取得できません。
これを乗り越える方法は?NSPipe には非同期デリゲート メソッドがありますか? または、タイマーを設定して、NSPipe インスタンスの現在の状態を要求し続ける必要がありますか? それともNSタスク?実装できるハンドラ ブロックはありますか?
私は本当にココアに慣れていないので(主にiOSをやった)、これにアプローチする方法がわかりません。