Also, das ist mein Code:Async Ausführung von Shell-Befehl nicht richtig
- (void)runCmd:(NSString *)cmd withArgs:(NSArray *)args
{
NSLog(@"\nRunning ::\n\tCmd : %@\n\tArgs : %@",cmd, args);
[theSpinner start];
if (task)
{
[task interrupt];
}
else
{
task = [[NSTask alloc] init];
[task setLaunchPath:cmd];
[task setArguments:args];
[pipe release];
pipe = [[NSPipe alloc] init];
[task setStandardOutput:pipe];
NSFileHandle* fh = [pipe fileHandleForReading];
NSNotificationCenter* nc;
nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self];
[nc addObserver:self
selector:@selector(dataReady:)
name:NSFileHandleReadCompletionNotification
object:fh];
[nc addObserver:self selector:@selector(dataAvailable:) name:NSFileHandleDataAvailableNotification object:fh];
[nc addObserver:self
selector:@selector(taskTerminated:)
name:NSTaskDidTerminateNotification
object:task];
[task launch];
[fh readInBackgroundAndNotify];
}
}
- (void)dataAvailable:(NSNotification*)n
{
NSLog(@"Data Available : %@",n);
}
- (void)dataReady:(NSNotification*)n
{
NSData* d;
d = [[n userInfo] valueForKey:NSFileHandleNotificationDataItem];
NSLog(@"Data Ready : %@",n);
if ([d length])
{
NSLog(@"Data Ready : %@",[[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding]);
}
}
- (void) taskTerminated:(NSNotification*)note
{
NSLog(@"Task Terminated : %@",note);
[task release];
task = nil;
[theSpinner stop];
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
[alert setMessageText:[NSString stringWithFormat:@"Command finished"]];
[alert runModal];
}
Ich habe versucht, einen Befehl ausgeführt wird (zB der PHP-Interpreter bei /usr/bin/php
) mit Argumenten (zB die Datei interpretiert werden php test.php
).
Die Sache ist die:
- Das Skript fein läuft
- ABER, Ich erhalte eine
Data Ready
undTask Terminated
Benachrichtigung, bevor ich habe es geschafft, alle Ausgaben zu bekommen. (Ich meine, diedataReady:
Funktion holt nur der erste Teil des
Ausgang und dem Rest der es nirgends zu finden ist ...)
Ich möchte im Grunde genommen, asynchron zu lesen, alle Ausgangs - Während der Befehl ausgeführt wird.
Irgendwelche Ideen? Was mache ich falsch?
Danke!
Absolut korrekt. (Habe es mir selbst ausgedacht, übrigens, aber vielen Dank trotzdem! ;-)) –