gpt4 book ai didi

swift - 通过 HTTP 发送 `NSManagedObjects`

转载 作者:行者123 更新时间:2023-11-28 12:06:00 27 4
gpt4 key购买 nike

我在一个简单的应用程序中有一个 NSManagedObject 的简单子(monad)类,应该从 iPhone 收集数据并将数据发送到服务器。

这是这个类的样子:

import Foundation
import CoreData

extension TestSession {


@NSManaged var bootTime: NSNumber?
@NSManaged var accelerometerData: Data?
@NSManaged var gyroscopeData: Data?
@NSManaged var motionData: Data?
@NSManaged var magnetometerData: Data?


}

现在,假设我有一个 TestSession 的实例 TodaysSession,我想在 POST 请求中发送它。

到目前为止,我一直在做的是将这些数据覆盖到一个字符串中(例如,取消归档 accelerometerData 以获取 CMAcceleration 对象数组,然后转换时间戳, x、y 和 z 组件转换为 CSV 格式)。

这是非常低效的(就字符串大小和时间而言)。

我做了一些研究并找到了一些选项:使用 Codable,虽然这对我不起作用,NSKeyedArchiver

但我不确定每个都提供什么优势,或者是否有其他更好的选择,我不知道(并且在我的研究中没有找到,不知道要寻找什么)

最佳答案

你可以让一个 NSManagedObject 子类采用 Encodable 但考虑到 Data 类型在被发送之前必须是 base64Encoded在 HTTP 请求中

extension TestSession : Encodable {

@NSManaged var bootTime: NSNumber?
@NSManaged var accelerometerData: Data?
@NSManaged var gyroscopeData: Data?
@NSManaged var motionData: Data?
@NSManaged var magnetometerData: Data?


private enum CodingKeys: String, CodingKey { case bootTime, accelerometerData, gyroscopeData, motionData, magnetometerData}

public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(bootTime, forKey: .bootTime)
try container.encode(accelerometerData?.base64EncodedString() , forKey: .accelerometerData)
try container.encode(gyroscopeData?.base64EncodedString() , forKey: .gyroscopeData)
try container.encode(motionData?.base64EncodedString() , forKey: .motionData)
try container.encode(magnetometerData?.base64EncodedString() , forKey: .magnetometerData)
}

}

现在您可以轻松地对实例进行编码

do {
let sessionData = try JSONEncoder().encode(session)
// do something with sessionData
} catch { print(error) }

关于swift - 通过 HTTP 发送 `NSManagedObjects`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49366107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com