我在一个简单的应用程序中有一个简单的NSManagedObject
子类,它应该从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?
}
现在,假设我有一个TodaysSession
TestSession
的实例,我想发送一个POST请求。
到目前为止,我正在做的是将这些数据覆盖到一个字符串(例如,解压缩accelerometerData
以获取CMAcceleration
个对象的数组,然后转换时间戳,x,y和z组件为CSV格式。)
这是非常低效的(就字符串大小和时间而言)。
我做了一些研究并找到了一些选项:使用Codable
,虽然这对我不起作用,NSKeyedArchiver
但是我不确定每个提供什么优势,或者是否有其他更好的选择,我不知道(并且在我的研究中没有找到,不知道该寻找什么)
答案 0 :(得分:2)
您可以让NSManagedObject
子类采用Encodable
,但在通过HTTP请求发送之前,请考虑Data
类型必须为base64Encoded
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) }
答案 1 :(得分:0)
将您的managedObject转换为字典,然后将该字典转换为json。
extension TestSession {
@NSManaged var bootTime: NSNumber?
@NSManaged var accelerometerData: Data?// Decode Data into Dictionary
@NSManaged var gyroscopeData: Data?// Decode Data into Dictionary
@NSManaged var motionData: Data?// Decode Data into Dictionary
@NSManaged var magnetometerData: Data?// Decode Data into Dictionary
var toJson: [String: AnyObject] {
var dictionary: [String: AnyObject] = [:]
let properties = self.entity.propertiesByName
for (key, description) in properties {
if let value = self.value(forKey: key) {
dictionary[key] = value as AnyObject
}
}
return dictionary
}
}
在您的api通话方法中,只需传递managedObject
,然后像这样使用它。
func makeAPICall(session: TestSession) {
var requesst = URLRequest(url: URL(string: "https://yourURL.com/api")!)
requesst.httpMethod = "POST"
do{
let jsonData = JSONSerialization.data(withJSONObject: session.toJson, options: .prettyPrinted)
requesst.httpBody = jsonData
URLSession.shared.dataTask(with: requesst, completionHandler: { (data, response, error) in
}).resume()
}
catch let error {
print(error.localizedDescription)
}
}