Swift:通过HTTP

时间:2018-03-29 11:38:49

标签: ios json swift http

我以为我会在几个小时后进行不确定的研究和测试:

简介

我正在尝试将非常大的Double数组从应用程序发送到服务器,当然,我想尽可能地压缩它。 具体来说,这些数组包含CMDeviceMotion个组件(加速度,x,y,z,陀螺仪等......),但这个问题应该适用于任何大数字(超过100K或一百万个值)

我通过研究选项

尝试和发现了什么

假设我有一大堆Double(还有很多其他人):

var CMX = CM.map({$0.userAcceleration.x})

此处,CMX的类型为[Double]CM[CMDeviceMotion]

我尝试通过以不同方式发送POST来向我的服务器发出CMX个请求,然后在服务器上收到后计算总大小:

  1. 首先,作为单个逗号分隔的字符串: {"AX":"-0.0441827848553658,-0.103976868093014,-0.117475733160973,-0.206566318869591,-0.266509801149368,-0.282151937484741,-0.260240525007248,-0.266505032777786,-0.315020948648453,-0.305839896202087,0.0255246963351965,0.0783950537443161,0.0749507397413254,0.0760494321584702,-0.0101579604670405,0.106710642576218,0.131824940443039,0.0630970001220703,0.21177926659584,0.27022996544838,0.222621202468872,0.234281644225121,0.288497060537338,0.176655143499374,0.193904414772987,0.169417425990105,0.150193274021149,0.00871349219232798,-0.0270088445395231,-0.0 ....
  2. 大小153 Kb。

    这比作为二进制数据发送更大是有道理的,因为这里的单个数字是64位(8字节),并且变为17字节长(每个字符一个字节)+1 = 18(添加了一个字符用于逗号)。

    有了这个推理,将数组作为二进制数据发送应该更小。

    1. Base 64编码
    2. 在这里,我使用Data将数组转换为NSKeyedArchiver对象,并在发送数据之前对数据进行64位编码:

      ["AX":NSKeyedArchiver.archivedData(withRootObject:CM.map({$0.userAcceleration.x})).base64EncodedString()]

      这使文件大小为206 Kb

      1. 将数据作为JSON数组发送
      2. 只需发送:

        ["AX": CM.map({$0.userAcceleration.x})]

        事实证明,这个数字数组实际上已经转换为逗号分隔的字符串,大小最终与试验1(160Kb)相同

        1. 发送为Data,不带base 64编码
        2. 这样做:

          ["AX":NSKeyedArchiver.archivedData(withRootObject:CM.map({$0.userAcceleration.x}))

          使应用程序在运行时崩溃,因此我无法将Data对象作为JSON中的值发送

          问题

          如何在JSON对象中以更精简的方式发送这些数组?

          请注意,我已经考虑了下采样,并使用32位浮点数来减小大小。

1 个答案:

答案 0 :(得分:1)

简单的方法就是这样做:

$('.js-daterangepicker').daterangepicker({
});

你有二进制缓冲区,所有的双打/浮动组合在一起。

但由于HTTP是基于文本的协议,因此您必须将此let data: Data = CMX.withUnsafeBufferPointer { pointer in return Data(buffer: pointer) } 转换为base64字符串:

data

这个let base64String = data.base64EncodedString() 应该传递给base64String (?) AX请求的POST参数。

修改

要将其转换回来,您可以使用以下代码:

HTTP