swift - 通过 HTTP 发送 `NSManagedObjects`

标签 swift core-data

我在一个简单的应用程序中有一个 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/

相关文章:

swift - 如何为 MacOS Big Sur 创建菜单栏 SwiftUI 应用程序

swift - 如何获得扩展以返回子类类型

objective-c - 优化CoreData全文查询

ios - 如何在 Swift 的 CoreData 模型中保存动态创建的 UISwitch 的更改状态?

iphone - 将现有数据导入核心数据

ios - 观察异步请求

ios - Swift XCode 使用任务从网站提取数据,但我无法将数据获取到其他函数中以使用 TableView 显示它

iphone - Collection <NSCFSet : 0x1b0b30> was mutated while being enumerated. 如何判断是哪个集合?

ios - 获取当前设备,也在模拟器中

swift - parent 暂停时是否可以对 child 执行操作