(iOS的Swift parse.com) – 可能存储自定义对象在PFObject子类?

我试图在Swift iOS中使用parse.com(1.7.3)在本地数据存储中存储数据。 继parse.com docs 这里 ,我能够inheritancePFObject存储一个简单的对象。 不过,我希望能够这个对象构build一个自定义对象,并且这个过程中遇到困难。

我已经把这个问题简化到了最基本的地步,并且在下面包含了我的代码。 基本上我存储一个名为“Test”的PFObject子类,它将存储一个String(testString)和一个名为Test2的自定义对象。 Test2又会存储一个String(testString)。 我假设Test2也需要inheritancePFObject。

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

AppDelegate.swift

(在AppDelegate中注册子类而不是初始化方法 – 请参阅这里了解更多细节。)

 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的属性,应用程序将挂起。 我也不能'获取'testing对象。 奇怪的是,如果我加载本地存储的任何Test2对象(与上面的loadTest方法相同,任何提及TestreplaceTest2),我find了Test2对象:

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

所以在固定testing对象时,test2也被固定了。 但是由于某种原因,test2对象没有连接到testing对象。

我开始迷失了,似乎无法find相关的(或准确的)文档或示例项目,这可能会在一秒钟之内清除所有这些…什么是最好的方法(如果有的话)组成一个习惯PFObject子类中的对象?

这里有一个想法可以帮助你在这种情况下。 你的Test类是PFObject的一个子类。 你在Test类里有一个名为Test2的自定义对象。

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

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

你可以使用这个字典来存储你的对象的详细信息作为一个对象在你的Test对象中。 现在,parsing支持字典,你已经把它转换成字典。 它会保存对象。

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

 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方法的query.findObjectsInBackgroundWithBlock中调用这个对象的init方法,并用你从parsing中得到的字典值创build对象。

希望,我的想法可以帮助你.. 🙂