iOS命名管道,可在ObjC中使用,不适用于Swift,相同代码

问题描述 投票:0回答:1

我一直在尝试在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

ios swift system named-pipes darwin
1个回答
0
投票

@@ gnasher729是正确的-Swift没有八进制,所以0777错误。我将八进制转换为十六进制,并将文字替换为0x1FF

© www.soinside.com 2019 - 2024. All rights reserved.