如何解决从SQL将图像作为数据下载到iOS
美好的一天,
我需要我的应用程序才能从sql数据库下载图像并将其保存到Core Data。
奇怪的是,我得到了图像,但是当我将其指定为Data
时,如果我强制使用它就会崩溃,或者当我不使用它时返回为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)
}
此输出为
<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
对我想念的东西有任何想法吗?
预告片, 乔纳斯(Jonas)
解决方法
一些观察结果:
-
您返回的数据与您认为的不一样。值得注意的是,与
image
键关联的值是21个字符串,"Optional(71918 bytes)"
,即字符O
,后跟p
,后跟t
,依此类推。该值是该短字符串,而不是71kb的图片资源。因此准备此JSON的任何内容都不包括图像,而是包括此短字符串。 (顺便说一句,该字符串看起来像是Swift将从可选对象生成的字符串表示形式,因此我想知道图像是否上传不正确。)
您尚未分享此JSON的准备方式,因此我们无法对此发表进一步评论。但我建议您确认SQL数据库中的实际内容,并弄清楚SQL数据库是否包含该字符串(建议您的原始上载例程出现问题)或SQL数据库是否包含图像,并且问题在于响应如何已创建。
-
JSONSerialization
仅处理NSNumber
,NSString
,NSNull
,NSDictionary
和NSArray
的值。您的示例的字符串为"Optional(71918 bytes)"
。您不能只是将其NSString
转换为Data
。那将永远失败。 -
您不能只将图像有效载荷的二进制数据包含在JSON中。这里有两个选项:
-
您可以让服务器base-64对图像有效载荷进行编码,然后再将其添加到JSON(使传输的内容比实际图像资产大33%),然后应用程序可以在解析后对base-64进行解码它来自JSON。
使用
Decodable
和JSONDecoder
,您可以将base-64字符串自动解析为Data
,但是如果使用JSONSerialization
,则必须手动操作。 -
而不是在JSON中包含图像,而是提供一个URL,客户端可以通过该URL单独下载图像。
但是JSON是文本表示形式,图像是二进制资产。
-
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。