(iOS Swift parse.com) - 可以在PFObject子类中存储自定义对象吗?

时间:2015-05-20 00:57:19

标签: ios swift parse-platform

我正在尝试使用Swift iOS中的parse.com(1.7.3)将数据存储在本地数据存储中。在parse.com文档here之后,我能够将PFObject子类化以存储一个简单的对象。但是我希望在这个对象中组成一个自定义对象,并且发现这样做有困难。

我已将此问题重新删回到最基本的问题,并在下面包含我的代码。基本上我存储了一个名为'Test'的PFObject子类,它将存储一个String(testString)和一个名为Test2的自定义对象。反过来,Test2也会存储一个String(testString)。我假设Test2也需要子类化PFObject。

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

AppDelegate.swift

(在AppDelegate中注册子类而不是Initialise方法 - 有关更多详细信息,请参阅here。)

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的属性,应用程序将挂起。我也无法'获取'Test对象。奇怪的是,如果我加载本地存储的任何Test2对象(与上面的loadTest方法相同,并提及Test替换为Test2),我执行找到Test2对象:

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

因此,在固定测试对象时,test2也被固定。但是,test2对象由于某种原因未连接到测试对象。<​​/ p>

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

1 个答案:

答案 0 :(得分:1)

这是一个可以在这种情况下帮助你的想法。您的测试类是 PFObject 的子类。并且您在Test类中有一个自定义对象,名为 Test2

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

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

您可以使用此词典将对象详细信息存储为测试对象中的对象。现在,解析支持字典,并且您已将其转换为字典。它会保存对象。

现在在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方法的query.findObjectsInBackgroundWithBlock中调用此对象的init方法,并使用从解析中获得的字典值创建对象。

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