. [server waitUntilExit]
numaralı çağrı, görevler bitene kadar çalışma döngüsünü engeller.
Görev çıktısını almak için gereken async çözümü.
task.standardOutput = [NSPipe pipe];
[[task.standardOutput fileHandleForReading] setReadabilityHandler:^(NSFileHandle *file) {
NSData *data = [file availableData]; // this will read to EOF, so call only once
NSLog(@"Task output! %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
// if you're collecting the whole output of a task, you may store it on a property
[self.taskOutput appendData:data];
}];
Muhtemelen task.standardError
için aynı yukarıda tekrarlamak istiyorum.
ÖNEMLİ:
senin görevin sona zaman, nil readabilityHandler bloğu ayarlamak zorunda; Aksi takdirde, okuma asla durmayacağından yüksek CPU kullanımıyla karşılaşırsınız.
[task setTerminationHandler:^(NSTask *task) {
// do your stuff on completion
[task.standardOutput fileHandleForReading].readabilityHandler = nil;
[task.standardError fileHandleForReading].readabilityHandler = nil;
}];
Bu
tüm asenkron (ve bunu zaman uyumsuz yapmalısınız), bu nedenle yöntem^tamamlama bloğu olmalıdır.
Sunucu.sh komut dosyasının standart çıktıda çıktığından emin misiniz? Belki de stderr'i bağlaman ve bir şey içerip içermediğini görmelisin. Ayrıca, okunmakta olan borudan fazla veri yazdırmaya çalışırsa ve arabellek dolduğunda, görev, çalışmakta olan borudan veri okumayı düşünebilirsiniz. Bir şey çıkarmaya çalışır. –
Emin değilim. Bana bir örnek gösterebilir misin? Evet, [task release] ve [task waitUntilExit] 'i kaldırdım. Aynı sorun. – objectiveccoder001
String'in içeriğini programlı olarak mı kontrol ediyorsunuz (veya gdb'de), yoksa NSLog'u kullanarak bir şeyler mi yazdırmaya çalışıyorsunuz? NSLog kullanıyorsanız ve hiç çıktı göremiyorsanız, çıkışınız için Uygulamalar> Yardımcı Programlar'da Konsol günlüğünü kontrol edin. Kabuk betikleri, NSTask'ın Xcode konsolu çıkışının çalışmasını durdurabileceği şekilde çalışır.Bunun dışında, Kevin'ın standart hata üzerinde bir şey olup olmadığını (sadece ikinci bir boru ekleyip görevinizin standart hatası olarak belirlediğini) kontrol etmenin ve boruların tümünün Görevinizin çıktı. – puzzle