4

OSX 上の特定のフォルダーのすべてのサブフォルダーを反復処理し、見つかったフォルダーごとにデリゲートにメッセージを送信するクラスがあります。

見つかったフォルダーごとに、NSTask. ここまでは順調ですね。問題が発生するのは、 を に指定したときterminationHandlerです。NSTask

これはコードです:

-(void)crawler:(FTCFileSystemCrawler *)aCrawler
 didFindFolder:(NSURL *)aURL
      withName:(NSString *)aFileName
          stop:(BOOL *)stop{

    NSTask *task = [NSTask new];
    task.launchPath = @"/usr/bin/say";
    task.arguments = @[aFileName];
    task.terminationHandler = ^(NSTask *aTask){
        NSLog(@"Terminating!");
        [self.tasks removeObject:aTask];

    };
    [self.tasks addObject:task];

    [task launch];
    //[task waitUntilExit];


}

これは正常に動作します。 に送信launchした後NSTask、 を送信しますwaitUntilExit。そうしないと、終了ハンドラーが実行されません。

私は何を間違っていますか?

PS これは単なる例であることに注意してください。私は実際にこれを使用してgitリポジトリを識別し、コマンドを実行しています。

4

3 に答える 3

2

使用しているにもかかわらず、このようなことを試しましたか?task.terminationHandler = ^(NSTask *aTask)問題は、適切に処理されていないこのブロック内で使用している可能性があります.

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(taskDidTerminate:)
                                             name:NSTaskDidTerminateNotification
                                           object:nil];
于 2013-10-08T11:14:36.943 に答える
1

taskプロパティに保存して、メソッドのスコープの最後に到達したときに割り当てが解除されるのを防ぐために、プロパティに格納する価値がある場合があります。たとえば、ヘッダーまたはプライベート インターフェイスで次のようにします。

@property (nonatomic, strong) NSTask *activeTask;

そして、メソッドの最後にそれを設定します:

self.activeTask = task;
于 2013-10-07T20:49:34.807 に答える