我一直在尝试在iOS中使用命名管道,但似乎基本上相同的代码在Swift中失败,而在ObjectiveC中却起作用。
[在Swift中,用于编写的FileHandle返回nil,或者如果我使用FileHandle(forWritingAt:URL)API,它将抛出Permission Denied。在目标C中,数据已成功通过管道发送并记录。
两者的路径完全相同。尽管已传递到函数中,但Objective C示例中的数据也是“ hello” .data(使用:.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))
}
目标C
remove(path.UTF8String);
mkfifo(path.UTF8String, 0777);
dispatch_async(dispatch_get_main_queue(), ^{
NSFileHandle *fileHandle=[NSFileHandle fileHandleForWritingAtPath: path];
[fileHandle writeData:data];
});
NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath: path];
NSData* read = fileHandle.availableData;
NSLog([[NSString alloc] initWithData: read encoding: NSUTF8StringEncoding]);
这些应该只是调用Objective C函数吗?他们为什么会有不同的举止?XCode 11.3,iOS 13
@@ gnasher729是正确的-Swift没有八进制,所以0777错误。我将八进制转换为十六进制,并将文字替换为0x1FF