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