Изменение кода, которое сделало пример, наконец, сработало, изменило дескриптор файла stdout на небуферизованный (setvbuf (stdout, nil, _IONBF, 0)):
//
// ViewController.swift
// Scroll View Demo
//
//
//
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
@IBOutlet weak var writeButton: UIButton!
var pipe = Pipe()
var count = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// dup2() makes newfd (new file descriptor) be the copy of oldfd (old file descriptor), closing newfd first if necessary.
openConsolePipe()
print("\npipe started")
}
@IBAction func buttonPressed(_ sender: Any) {
print("\(count). Hello world")
count += 1
}
public func openConsolePipe () {
**setvbuf(stdout, nil, _IONBF, 0).** //<--------- !
dup2(pipe.fileHandleForWriting.fileDescriptor,
STDOUT_FILENO)
// listening on the readabilityHandler
pipe.fileHandleForReading.readabilityHandler = {
[weak self] handle in
let data = handle.availableData
let str = String(data: data, encoding: .ascii) ?? "<Non-ascii data of size\(data.count)>\n"
DispatchQueue.main.async {
self?.textView.text += str
}
}
}
Это потому, что приложение работаетотключенный от Xcode стандартный вывод перенаправляется во что-то вроде / dev / null с буферизацией, установленной в «буферизированный», и, таким образом, никогда не появляется в pipe ().Установка небуферизованного заставила вещи работать.