可以在PFObject子类中存储自定义对象



我正在尝试使用Swift iOS中的parse.com(1.7.3)在本地数据存储中存储数据。按照这里的parse.com文档,我可以创建PFObject的子类来存储一个简单的对象。然而,我希望在这个对象内组成一个自定义对象,我发现这样做很困难。

我将这个问题剥离回最基本的部分,并将我的代码包含在下面。基本上,我正在存储一个名为"Test"的PFObject子类,它将存储一个字符串(testString)和一个名为Test2的自定义对象。Test2反过来也将存储一个String(testString)。我假设Test2也需要创建PFObject的子类。

Test - testString(String)
     - test2(Test2)
          - testString(String)

AppDelegate.swift

(在AppDelegate中注册子类而不是initialize方法——更多细节见这里)

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Test.registerSubclass()
    Test2.registerSubclass()
    Parse.enableLocalDatastore()
    Parse.setApplicationId("...", clientKey: "...")
}

Test2.swift

class Test2:PFObject, PFSubclassing {
    @NSManaged var testString:String
    static func parseClassName() -> String {
        return "Test2"
    }
}

Test.swift

class Test:PFObject, PFSubclassing {
    @NSManaged var testString:String
    @NSManaged var test2:Test2
    static func parseClassName() -> String {
        return "Test"
    }
}

ViewController.swift

override func viewDidLoad() {
    saveTest()  //toggle between save and load, don't do both!
    //loadTest()
}
func saveTest() {
        var test2 = Test2()
        test2.testString = "I am Test 2"
        var test = Test()
        test.testString = "I am Test"
        test.test2 = test2
        test.pinInBackground()
}
func loadTest() {
    let query = PFQuery(className:Test.parseClassName())
    query.fromLocalDatastore()
    query.findObjectsInBackgroundWithBlock({
        (objects:[AnyObject]?, error: NSError?) in
        if let error = error {
            println("THERE WAS AN ERROR")
            // There was an error
        } else {
            if let objects = objects as? [PFObject] {
                for object in objects {
                    //We have an object!
                    println("We have a PFObject, now to cast as Test")
                    if let object = object as? Test {
                        println(object)
                    }
                }
            }
        }
    })
}

所以loadTest中的println在控制台中输出如下内容:

<Test: 0x7ff2da75e810, objectId: new, localId: local_15a085d00030543f> {
    test2 = "<Test2: 0x7ff2db90fe50, objectId: new>";
    testString = "I am Test";
}

如果我试图访问test2属性或test2的属性,应用程序会挂起。我也不能"获取"测试对象。奇怪的是,如果我加载本地存储的任何Test2对象(与上面的loadTest方法相同,只是将Test替换为Test2),我查找Test2对象:

<Test2: 0x7f94b1f1e850, objectId: new, localId: (null)> {
    testString = "I am Test 2";
}

所以在固定测试对象时,test2也被固定。然而,由于某种原因,test2对象没有连接到测试对象。

我开始迷路了,似乎找不到相关的(或准确的)文档或样本项目,这可能会在一秒钟内澄清这一切…在PFObject子类中组合自定义对象的最佳方法(如果有的话)是什么?

这里有一个想法可以帮助你解决这个问题。你的Test类是PFObject的子类。并且在Test类中有一个自定义对象,名为Test2

Test2.swift文件中,创建一个方法,该方法将返回一个NSDictionary对象,该对象包含其对象的所有属性。有点类似于:

class func objDetail() -> NSDictionary {
return [
    "key1": self.property1,
    "key2": self.property2,
    // ...
        ] as NSDictionary
}

你可以使用这个字典将你的对象细节作为一个对象存储在你的Test对象中。现在,parse支持字典,你已经在字典中转换了它。它将保存对象。

现在在swift文件中添加另一个方法来基于字典值创建对象。

convenience init(_ dictionary: Dictionary<String, AnyObject>) {
    self.init()
    title = dictionary["title"] as? NSString
    shortDescription = dictionary["shortDescription"] as? NSString
    newsDescription = dictionary["newsDescription"] as? NSString
    link = dictionary["link"] as? NSURL
}

用于在loadTest方法的查询中检索对象。findObjectsInBackgroundWithBlock调用这个对象的init方法,用你从parse中得到的字典值创建对象。

希望我的想法对你有帮助。:)

最新更新