2014-11-20 20 views
8

Diese Codezeile:Wie benutzt man posix_spawn, um das veraltete 'System' zu ersetzen, um Openendiff in Objective-C zu starten?

system("/Applications/Xcode.app/Contents/Developer/usr/bin/opendiff /Users/LukeSkywalker/Documents/doc1.rtf /Users/LukeSkywalker/Documents/doc2.rtf"); 

gibt mir diese Warnung:

'system' is deprecated: first deprecated in iOS 8.0 - Use posix_spawn APIs instead. 

ich ein wenig über posix_spawn gelesen habe, aber ich kann unter Verwendung einer äquivalenten Codezeile nicht herausfinden, was posix_spawn würde aussehen wie.

Jede Hilfe oder Links zu Proben wäre willkommen.

Antwort

12

Mit posix_spawn(), Ihre Frage zu beantworten:

#include <spawn.h> 
extern char **environ; 

(...)

pid_t pid; 
char *argv[] = { 
    "/Applications/Xcode.app/Contents/Developer/usr/bin/opendiff", 
    "/Users/LukeSkywalker/Documents/doc1.rtf", 
    "/Users/LukeSkywalker/Documents/doc2.rtf", 
    NULL 
}; 

posix_spawn(&pid, argv[0], NULL, NULL, argv, environ); 
waitpid(pid, NULL, 0); 

Oder könnten Sie verwenden NSTask:

NSTask *task = [[NSTask alloc] init]; 
task.launchPath = @"/Applications/Xcode.app/Contents/Developer/usr/bin/opendiff"; 
task.arguments = [NSArray arrayWithObjects: 
        @"/Users/LukeSkywalker/Documents/doc1.rtf", 
        @"/Users/LukeSkywalker/Documents/doc2.rtf", 
        nil]; 
[task launch]; 
[task waitUntilExit]; 

Wenn Sie nicht tun muss es synchron sein, entfernen Sie einfach den Anruf zu waitpid() (stellen Sie sicher, es irgendwo els zu nennen e, oder du wirst mit einem Zombie-Prozess enden, bis deine App beendet wird) oder [task waitUntilExit].

1

Swift 3, Xcode 8.3.1

func system(_ command: String) { 
    var args = command.components(separatedBy: " ") 
    let path = args.first 
    args.remove(at: 0) 

    let task = Process() 
    task.launchPath = path 
    task.arguments = args 
    task.launch() 
    task.waitUntilExit() 
}