3

別の方法で尋ねるには:

たとえば、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をやった)、これにアプローチする方法がわかりません。

4

1 に答える 1

4

「readDataToEndOfFile」でブロックしています。代わりに、「readInBackgroundAndNotify」を使用する必要があります。

于 2013-06-18T21:12:50.803 に答える