Я пытался использовать именованные каналы в iOS, но, похоже, в основном тот же код в Swift дает сбой, в то время как в Objective C он работает.
В Swift FileHandle для записи возвращается ноль, или если я использую API-интерфейс FileHandle (forWritingAt: URL), он выдает разрешение «Отказано». В Objective C данные успешно отправлены через канал и зарегистрированы.
Путь в обоих из них является точно таким же. Данные в примере Objective C также "hello" .data (используя: .utf8), хотя и передаются в функцию.
Swift
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))
}
Objective 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