从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是文本表示形式,图像是二进制资产。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...