Swift GDC фоновый процесс зависает приложение

Я написал функцию, которая запускает процесс Tor. Это процесс, который не остановится, пока SIGTERM не будет отправлен на него, поэтому, чтобы избежать зависания приложения, я запускаю этот процесс в фоновой очереди (Tor должен запускаться, когда приложение запускается и завершается, когда приложение завершается, и пользователь нужно сделать что-то еще) Вот мой код для запуска Tor:

func launchTor(hashedPassword hash : String) {

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
        let task = NSTask()
        task.launchPath = "/bin/bash"
        print("Hashed password : \(hash)")
        task.arguments = (["-c", "/usr/local/bin/tor HashedControlPassword \(hash)"])

        let pipe = NSPipe()
        task.standardOutput = pipe
        let handle = pipe.fileHandleForReading
        handle.waitForDataInBackgroundAndNotify()

        let errPipe = NSPipe()
        task.standardError = errPipe
        let errHandle = errPipe.fileHandleForReading
        errHandle.waitForDataInBackgroundAndNotify()

        var startObserver : NSObjectProtocol!
        startObserver = NSNotificationCenter.defaultCenter().addObserverForName(NSFileHandleDataAvailableNotification, object: nil, queue: nil) { notification -> Void in
            let data = handle.availableData
            if data.length > 0 {
                if let output = String(data: data, encoding: NSUTF8StringEncoding) {
                    print("Output : \(output)")
                }
            }
            else {
                print("EOF on stdout")
                NSNotificationCenter.defaultCenter().removeObserver(startObserver)
            }
        }

        var endObserver : NSObjectProtocol!
        endObserver = NSNotificationCenter.defaultCenter().addObserverForName(NSTaskDidTerminateNotification, object: nil, queue: nil) {
            notification -> Void in
            print("Task terminated with code \(task.terminationStatus)")
            NSNotificationCenter.defaultCenter().removeObserver(endObserver)
        }

        var errObserver : NSObjectProtocol!
        errObserver = NSNotificationCenter.defaultCenter().addObserverForName(NSTaskDidTerminateNotification, object: nil, queue: nil) {
            notification -> Void in
            let data = errHandle.availableData
            if (data.length > 0) {
                if let output = String(data: data, encoding: NSUTF8StringEncoding) {
                    print("Error : \(output)")

                    NSNotificationCenter.defaultCenter().removeObserver(errObserver)
                }
            }
        }

        task.launch()

        _ = NSNotificationCenter.defaultCenter().addObserverForName("AppTerminates", object: nil, queue: nil) {
            notification -> Void in
            task.terminate()
        }
        task.waitUntilExit()
    }
}

Когда он запускается, все в порядке, но затем все приложение зависает. Когда я останавливаю приложение, я всегда вижу, что let data = handle.availableData линия работает. Как исправить эту проблему?

0 ответов

Другие вопросы по тегам