【问题标题】:loading data object from local file in Swift 3在 Swift 3 中从本地文件加载数据对象
【发布时间】:2017-08-16 09:33:24
【问题描述】:

我很难在 Swift 3 中加载图像文件。 代码如下:

do {
    let imageData = try Data(contentsOf: imageUrl2.asURL()) 
} catch { 
    print ("loading image file error") 
}

而当前的Url String是:

file:///Users/veikoherne/Library/Developer/CoreSimulator/Devices/889A08D5-B8CC-458C-99FF-643A4BA1A806/data/Containers/Data/Application/F64ED326-7894-4EE7-AA3B-B1BB10DF8259/Documents/img2017-03-23 17:39:24.jpg

显然我已经检查过这个文件存在并且是有效的图像。它总是告诉我“加载图像文件错误”。有人有在 Swift 3 中加载本地数据的经验吗?

提到的答案是使用 NSData 对象,可能是 Swift 2。当前的 Swift 3 拒绝将 NSData 连接到 Data,这就是我必须使用 Data 的原因。

【问题讨论】:

  • imageUrl2 来自哪里? asURL() 是什么?您可能会打印实际捕获的 error 而不是通用字符串。
  • @vadian 提出了一些很好的问题。还有一个:...加载本地数据的经验... - 本地到什么?你的项目,一个框架,操作系统文件系统......???我将再添加一个选项来查看您的 URL - 这是在照片库中吗?相信我,有几个地方,每个地方都有一个“最好”的方法来到达它们。
  • 答案是使用 NSData,这在 Swift 2 中是可以的。Swift 3 要求我使用 Data 而不是 NSData..
  • to @vadian imageUrl 是文件的字符串,由于数据对象需要 URL,我必须使用 .asURL() 将字符串转换为 Url。它不是照片库,它是我存储在应用程序文档目录中的图像。显然我正在使用最新的 xCode 来拥有 Swift 3。

标签: ios swift swift3


【解决方案1】:

从本地文件加载数据你应该使用“contentsOfFile:”方法。

参考链接:https://www.hackingwithswift.com/example-code/strings/how-to-load-a-string-from-a-file-in-your-bundle

所以在读取数据的情况下你可以使用:

Data(contentsOf: <URL>, options: <Data.ReadingOptions>)

将纯文本读取为字符串,使用:

String(contentsOfFile: <LocalFileDirPath>)

从文档目录读取图像,使用:

UIImage(contentsOfFile: <LocalFileDirPath>)

希望这会有所帮助!

【讨论】:

  • 使用 contentsOfFile 会给我编译错误:“参数标签 '(contentsOfFile:)' 不匹配任何可用的重载”
  • 使用这个方法:Data(contentsOf: , options: )
  • 尝试过的选项:Data.ReadingOptions.uncachedRead 或 Data.ReadingOptions.mappedRead 没有任何运气。还是一样。
  • 我已经更新了从文档目录中读取图像的答案。我在我当前的项目中使用它。希望现在这会有所帮助。
  • 感谢 Dharmesh。我正在以您描述的方式读取数据,但无法正常工作。你能确认它对你有用吗?你使用什么选项?你能给我你的示例网址吗?
【解决方案2】:

我在尝试检索刚刚下载的文件时遇到了同样的问题。如果您像我一样从某个 url 保存了文件,这应该可以工作:

let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
let localUrl = documentDirectory.appendingPathComponent("somefile.txt")

if FileManager.default.fileExists(atPath: localUrl.path){
    if let cert = NSData(contentsOfFile: localUrl.path) {
        return cert as Data
    }
}

【讨论】:

  • 谢谢,感谢 URL 上的.path :)
【解决方案3】:

Swift 5 版本。

func loadFileFromLocalPath(_ localFilePath: String) ->Data? {
   return try? Data(contentsOf: URL(fileURLWithPath: localFilePath))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2016-10-28
    • 2018-12-27
    • 2017-11-09
    • 2015-12-04
    • 2018-05-11
    • 2013-08-28
    相关资源
    最近更新 更多