将图像作为数据从SQL下载到iOS
你好 我需要我的应用程序从SQL数据库下载图像并将其保存到核心数据 奇怪的是,我得到了图像,但当我将它指定为将图像作为数据从SQL下载到iOS,ios,json,swift,uiimage,Ios,Json,Swift,Uiimage,你好 我需要我的应用程序从SQL数据库下载图像并将其保存到核心数据 奇怪的是,我得到了图像,但当我将它指定为数据时,如果我强制它,它就会崩溃;如果我不强制它,它会返回为nil 我试过几次,但都失败了 我从以下代码开始: if let returnedData = data { let returnedString = String(data: returnedData, encoding: String.Encoding(rawValue: String.Encoding.utf8.ra
数据时,如果我强制它,它就会崩溃;如果我不强制它,它会返回为nil
我试过几次,但都失败了
我从以下代码开始:
if let returnedData = data {
let returnedString = String(data: returnedData, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))
print("<JON>Returned Data: \(returnedString!)")
var jsonResult = NSArray()
do {
jsonResult = try JSONSerialization.jsonObject(with: returnedData, options: .allowFragments) as! NSArray
}catch let error as NSError {
print(error)
}
var jsonElement = NSDictionary()
var iData: Data?
for i in jsonResult {
jsonElement = i as! [String:Any] as NSDictionary
for (v, k) in jsonElement {
print("<JON> vk ",v, k)
if v as! String == "image" {
print("<JON> img:")
iData = (k as? Data)
}
}
let id = jsonElement["id"] as! String
let imgData = jsonElement["image"]! as? Data
print("<JON-End>", id, imgData, iData)
}
如果let returnedData=data{
让returnedString=String(数据:returnedData,编码:String.encoding(rawValue:String.encoding.utf8.rawValue))
打印(“返回的数据:\(返回的字符串!)”)
var jsonResult=NSArray()
做{
jsonResult=尝试将JSONSerialization.jsonObject(带有:returnedData,选项:.allowFragments)作为!NSArray
}将let错误捕获为NSError{
打印(错误)
}
var jsonElement=NSDictionary()
var iData:数据?
对于jsonResult中的i{
jsonElement=i as![String:Any]as NSDictionary
对于jsonElement中的(v,k){
打印(“vk”,v,k)
如果v为!字符串==“图像”{
打印(“img:”)
iData=(k为?数据)
}
}
让id=jsonElement[“id”]作为!字符串
让imgData=jsonElement[“image”]!作为?数据
打印(“,id,imgData,iData)
}
这个函数的输出是
<JON>Returned Data: [{"id":"E5F61103-38B7-4DCC-BA76-542AFB6A7AB0","image":"Optional(71918 bytes)"}]
<JON> vk id E5F61103-38B7-4DCC-BA76-542AFB6A7AB0
<JON> vk image Optional(71918 bytes)
<JON> img:
<JON-End> E5F61103-38B7-4DCC-BA76-542AFB6A7AB0 nil nil
返回数据:[{“id”:“E5F61103-38B7-4DCC-BA76-542AFB6A7AB0”,“image”:“可选(71918字节)”}]
vk id E5F61103-38B7-4DCC-BA76-542AFB6A7AB0
vk映像可选(71918字节)
img:
E5F61103-38B7-4DCC-BA76-542AFB6A7AB0无无
你知道我错过了什么吗
里根,
乔纳斯一些观察结果:
返回的数据与您想象的不一样。值得注意的是,与图像
键相关联的值是一个21个字符的字符串,“可选(71918字节)”
,即字符O
,后跟p
,后跟t
,等等。该值是短字符串,而不是71kb图像资产
因此,无论准备此JSON的是什么,都不包括图像,而是这个短字符串(顺便说一句,该字符串看起来很可疑,它类似于Swift从可选字符串生成的字符串表示形式,因此我怀疑图像是否上传错误。)
你还没有分享这个JSON是如何准备的,所以我们不能对此做进一步的评论。但是我建议确认SQL数据库中真正的内容,并确定SQL数据库是否包含该字符串(这表明你原来的上传例程有问题)或者SQL数据库是否包含映像,问题在于如何创建响应
仅处理NSNumber
、NSString
、NSNull
、NSDictionary
和NSArray
的值。并且您的示例中有一个字符串是“可选(71918字节)”
。您不能将该字符串转换为NSString
,然后将其转换为数据
。这将始终失败
您不能只在JSON中包含图像负载的二进制数据。这里有两个选项:
- 您可以让您的服务器base-64在将图像有效负载添加到JSON之前对其进行编码(使传输的图像比实际图像资产大33%),然后应用程序可以在从JSON解析后对其进行base-64解码
使用
Decodable
和JSONDecoder
可以自动将此base-64字符串解析为数据
,但如果使用JSONSerialization
则必须手动执行
- 不要将图像包含在JSON中,而是提供一个URL,客户端可以通过该URL单独下载图像。
但是JSON是一种文本表示,图像是二进制资产
谢谢,我将改变我的方法,并使用图像的url。