我一直在尝试在 iOS 中使用命名管道,但在 Swift 中似乎基本上相同的代码会失败,而在 ObjectiveC 中却可以工作。
在 Swift 中,用于写入的 FileHandle 返回 nil,或者如果我使用 FileHandle(forWritingAt: URL) API,它会抛出 Permission Denied。在 Objective C 中,数据通过管道成功发送并记录。
这两个中的路径完全相同。Objective C 示例中的数据也是“hello”.data(using: .utf8),尽管传递到了函数中。
迅速
do {
try FileManager.default.removeItem(at: url)
} catch let error {
print("error deleting", error)
}
mkfifo(url.path, 0777)
DispatchQueue.main.async {
let fileHandle = FileHandle(forWritingAtPath: url.path)
fileHandle?.write("hello".data(using: .utf8)!)
}
let fileHandle = FileHandle(forReadingAtPath: url.path)
if let data = fileHandle?.availableData {
print(String(data: data, encoding: .utf8))
}
Run Code Online (Sandbox Code Playgroud)
目标C
remove(path.UTF8String);
mkfifo(path.UTF8String, 0777);
dispatch_async(dispatch_get_main_queue(), ^{
NSFileHandle *fileHandle=[NSFileHandle fileHandleForWritingAtPath: path];
[fileHandle writeData:data]; …Run Code Online (Sandbox Code Playgroud)