Задачи выполняются отдельно от вашего кода, то есть асинхронно. Они, вероятно, еще не закончили (возможно, даже не запустили!) К тому времени, как вы доберетесь до readDataToEndOfFile
двумя строками позже.
Если вы уже находитесь в фоновом потоке, вы можете опросить их статус: while( ![task isRunning]){
, или, если вы в основном потоке, я бы предложил использовать GCD, чтобы поместить это в очередь и выполнить опрос есть.
На самом деле лучше использовать уведомления:
[task3 launch];
[[NSNotificationCenter defaultCenter] addObserverForName:NSTaskDidTerminateNotification
object:task3
queue:nil
usingBlock:^{
NSData * data = [file readDataToEndOfFile];
NSString * string;
string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog(@"Result: %@", string);
}];
См. TN2050: время жизни процесса без опроса . Каждый NSTask
будет отправлять NSTaskDidTerminateNotification
, когда завершится (в идеале вы должны проверить его код возврата, а не предполагать, что он успешно работал). Вы можете создать блок для запуска, когда task3
отправляет это уведомление.