通过HTTP发送`NSManagedObjects`

时间:2018-03-19 15:04:23

标签: swift core-data

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

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

2 个答案:

答案 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)
    }
}