2011-02-28 8 views
2

私は、何かのリストをtxtに読み込むスクリプトを実行するためにNSTaskを取得しました。しかし、私の現在のコード(下記)を使用すると、NSTaskが終了する前に警告がポップアップし、空白の警告が表示されます。私はwaitUntilExitを試しましたが、これでこのアクションを呼び出すボタンはフリーズしますが、UIはロックされません。NSTask waitUntilExit jailbreakされたiOS上でアプリをぶら下げよう

- (void) runSupported { 
    stask = [[NSTask alloc] init]; 
    [stask setLaunchPath:@"/bin/bash"]; 
    NSString *script; 
    script = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/apps.sh"]; 
    NSArray *sargs = [NSArray arrayWithObjects:script, @"-txt", nil]; 
    [stask setArguments: sargs]; 
    [stask launch]; 

    NSString *apps; 
    apps = [NSString stringWithContentsOfFile:@"/var/mobile/supported.txt" encoding:NSUTF8StringEncoding error:nil]; 
    NSFileManager *fm = [NSFileManager defaultManager]; 
    if ([fm fileExistsAtPath:apps]) { 
     UIAlertView *supported = [[UIAlertView alloc] initWithTitle:@"App List" message:apps delegate:self cancelButtonTitle:@"Ok!" otherButtonTitles:nil]; 
     [supported show]; 
     [supported release]; 
    } else { 
     UIAlertView *supported = [[UIAlertView alloc] initWithTitle:@"App List" message:@"Error generating list." delegate:self cancelButtonTitle:@"Ok!" otherButtonTitles:nil]; 
     [supported show]; 
     [supported release]; 
    } 
} 

アラートを呼び出す前にどのようにNSTaskを終了したらよいでしょうか?ありがとう。

編集:NSNotificationとコード:

-(IBAction) supported { 
    stask = [[NSTask alloc] init]; 
    [stask setLaunchPath:@"/bin/bash"]; 
    NSString *script; 
    script = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/apps.sh"]; 
    NSArray *sargs = [NSArray arrayWithObjects:script, @"-txt", nil]; 
    [stask setArguments: sargs]; 
    [[NSNotificationCenter defaultCenter] addObserver: self 
              selector: @selector(taskEnded:) 
               name: NSTaskDidTerminateNotification 
               object: nil]; 
    [stask launch]; 
} 

- (void)taskEnded:(NSNotification *)notification { 
    if (stask == [[notification object] terminationStatus]) { 
     NSString *apps; 
     apps = [NSString stringWithContentsOfFile:@"/var/mobile/supported.txt" encoding:NSUTF8StringEncoding error:nil]; 
     NSFileManager *fm = [NSFileManager defaultManager]; 
     if ([fm fileExistsAtPath:apps]) { 
      UIAlertView *supported = [[UIAlertView alloc] initWithTitle:@"Apps" message:apps delegate:self cancelButtonTitle:@"Ok!" otherButtonTitles:nil]; 
      [supported show]; 
      [supported release]; 
     } else { 
      UIAlertView *supported = [[UIAlertView alloc] initWithTitle:@"Apps" message:@"Error generating list." delegate:self cancelButtonTitle:@"Ok!" otherButtonTitles:nil]; 
      [supported show]; 
      [supported release]; 
     } 
    } else { 
     NSLog(@"Task failed."); 
    } 
} 
+0

は何plateformあなたは、iPhoneやMacをターゲットにしているNSTaskは、iOSの上で許可されていない、とUIAlertViewは、Mac上に存在しない – Guillaume

+0

iOSのジェイルブレイク、正確には – Mitochondria

答えて

1

waitUntilExitを使用しないでください。

問題は、UIをブロックせずに(またはそのボタンをフリーズして)タスクが終了した後で何かを行う方法です。すべての同様の問題の解決方法は、タスクが終了したときにに通知され、その通知に応じてさらに進んでください(アラートを表示する)。

通知は、この場合、NSTaskDidTerminateNotificationというNSNotificationです。何らかの理由でタスクが終了すると、NSTaskオブジェクトはこの通知をデフォルトのNSNotificationCenterに送信します。終了ステータスが成功したか失敗したか、クラッシュしたかを判断するために、終了ステータスがどのようなものかをタスクに問い合わせることができます。

も参照してください。Notification Programming Topics

0

メインスレッドでwaitUntilExitを使用しないでください。それはあなたのUIをブロックし、あなたのアプリをフリーズします。通知は、タスクが正常に完了した場合は掲載、またはの結果としてできること

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(taskDidTerminate:) 
              name:NSTaskDidTerminateNotification 
              object:nil]; 

注:タスクが実行を停止した際に投稿された通知NSTaskDidTerminateNotificationに加入する必要が

terminateメッセージ:

- (void) taskDidTerminate:(NSNotification *)notification { 
    if (YOUR_TASK_SUCCESS_VALUE == [[notification object] terminationStatus]) { 
     NSLog(@"Task succeeded."); 
     // Here you can add your checks on the creation on the files and user alerts confirmation 
    } else { 
     NSLog(@"Task failed."); 
    } 
} 

が通知に解除することを忘れないでください。あなたは、通知にサブスクライブする場所に応じて、良い場所は、あなたのdealloc方法で次のようになります。

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

更新:あなたはiOSの、それを上同じように動作するMac上で文書化されて何かを期待します記載されていない。それほど驚くことではありません。

タスクを実行しようとしましたが、waitUntilExitメソッドをバックグラウンドスレッドで使用しましたか? あなたが運が良ければ、それがうまくいく場合は、UIAlertを表示するときにメインスレッドに戻ることを忘れないでください。

+0

私だけ編集したOP。私は(試した)NSNotificationコードを使っていましたが、デバッグコンソールでスクリプトが実行されているのが見えますが、アプリケーションにアラートが表示されません。 'taskEnded: 'を呼び出すようではありません。 – Mitochondria

0

AppleのMoriarityサンプルコードに基づくAMShellWrapperをご覧ください。

"自分のメソッドをstdoutとstderrに接続し、プロセスの終了やその他の通知を受け取ります。「

を参照してください:?。http://www.cocoadev.com/index.pl?NSTask

+0

。 – Mitochondria

関連する問題