微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从SQL将图像作为数据下载到iOS

如何解决从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)

解决方法

一些观察结果:

  1. 您返回的数据与您认为的不一样。值得注意的是,与image键关联的值是21个字符串,"Optional(71918 bytes)",即字符O,后跟p,后跟t,依此类推。该值是该短字符串,而不是71kb的图片资源。

    因此准备此JSON的任何内容都不包括图像,而是包括此短字符串。 (顺便说一句,该字符串看起来像是Swift将从可选对象生成的字符串表示形式,因此我想知道图像是否上传不正确。)

    您尚未分享此JSON的准备方式,因此我们无法对此发表进一步评论。但我建议您确认SQL数据库中的实际内容,并弄清楚SQL数据库是否包含该字符串(建议您的原始上载例程出现问题)或SQL数据库是否包含图像,并且问题在于响应如何已创建。

  2. JSONSerialization仅处理NSNumberNSStringNSNullNSDictionaryNSArray的值。您的示例的字符串为"Optional(71918 bytes)"。您不能只是将其NSString转换为Data。那将永远失败。

  3. 您不能只将图像有效载荷的二进制数据包含在JSON中。这里有两个选项:

    • 您可以让服务器base-64对图像有效载荷进行编码,然后再将其添加到JSON(使传输的内容比实际图像资产大33%),然后应用程序可以在解析后对base-64进行解码它来自JSON。

      使用DecodableJSONDecoder,您可以将base-64字符串自动解析为Data,但是如果使用JSONSerialization,则必须手动操作。

    • 而不是在JSON中包含图像,而是提供一个URL,客户端可以通过该URL单独下载图像。

    但是JSON是文本表示形式,图像是二进制资产。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。