title: NSTask waitUntilExit hanging app on jailbroken iOS
body: <p>So I've got NSTask to run a script which generates a list of something, into a txt, which I read from. But if I use my current code (below), the alert pops up before the NSTask is finished, thus resulting in a blank alert. I've tried <code>waitUntilExit</code> but that makes the button that invokes this action freeze, but the UI doesn't lock up itself.</p>
  
  <pre><code>- (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];
      }
  }
  </code></pre>
  
  <p>Any idea how I'd have the NSTask finish before invoking the alert? Thanks.</p>
  
  <p>Edit: Code with NSNotification:</p>
  
  <pre><code>-(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."); 
      }
  }
  </code></pre>