Tôi có một tập lệnh PHP có lệnh mutliple sleep()
. Tôi muốn thực hiện nó trong đơn đăng ký của tôi với NSTask
. Kịch bản của tôi trông như thế này:Đầu ra thời gian thực của NSTask
echo "first\n"; sleep(1); echo "second\n"; sleep(1); echo "third\n";
tôi có thể thực hiện nhiệm vụ của tôi không đồng bộ sử dụng thông báo:
- (void)awakeFromNib {
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/php"];
NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"-r", @"echo \"first\n\"; sleep(1); echo \"second\n\"; sleep(1); echo \"third\n\";", nil];
[task setArguments: arguments];
NSPipe *p = [NSPipe pipe];
[task setStandardOutput:p];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskExited:) name:NSTaskDidTerminateNotification object:task];
[task launch];
}
- (void)taskExited:(NSNotification *)notif {
NSTask *task = [notif object];
NSData *data = [[[task standardOutput] fileHandleForReading] readDataToEndOfFile];
NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"%@",str);
}
đầu ra của tôi là (sau 2 giây, tất nhiên):
2011-08-03 20:45:19.474 MyApp[3737:903] first
second
third
Câu hỏi của tôi là: làm thế nào tôi có thể nhận được ba từ ngay sau khi chúng được in?
Tôi đã thử điều đó nhưng chỉ ghi nhật ký "đầu tiên". "second" và "third" được ghi lại trên chấm dứt tác vụ ... – akashivskyy
Giải quyết nó bằng cách đặt thêm 'readInBackgroundAndNotify' vào' -receiveData'. Cảm ơn ý tưởng! – akashivskyy
Tôi đã cập nhật mã sau khi đấu tranh một thời gian. Bạn cần một 'waitForDataInBackgroundAndNotify' khác chứ không phải 'readInBackgroundAndNotify'. – citelao