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

将图像作为数据从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

你好

我需要我的应用程序从SQL数据库下载图像并将其保存到核心数据

奇怪的是,我得到了图像,但当我将它指定为
数据时,如果我强制它,它就会崩溃;如果我不强制它,它会返回为
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。