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

标签 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"
    }
}

测试.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 对象未连接到测试对象。<​​/p>

我开始迷路了,似乎找不到相关的(或准确的)文档或示例项目,它们可能会在一秒钟内解决所有这些问题……最好的方法是什么(如果有的话)在 PFObject 子类中编写自定义对象?

最佳答案

在这种情况下,这里有一个可以帮助您的想法。您的 Test 类是 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 方法,并使用从解析中获取的字典值创建对象。

希望,我的想法能帮到你.. :)

关于ios - (iOS Swift parse.com) - 可以在 PFObject 子类中存储自定义对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30338526/

相关文章:

ios - 从 NSMutable 数组中的解析中检索数据,然后从点击按钮的单元格中获取数据

ios - 私有(private)快速协议(protocol)是否可能?

ios - 使用 Swift 在 iOS 中全局检测屏幕转换(切换)

xcode - 您可以在没有按钮的情况下以编程方式关闭 View Controller 吗? - 操作系统

swift - Swift 中的 var 与 let

android - 将聊天服务器应用程序从 parse.com 移动到 google app engine

android - 将较大的文件上传到 Parse 时可能出现 OutOfMemoryException

ios - 在 Swift 扩展中存储变量的替代方法

ios - 在所有节点 SCNLight 上转换阴影

ios - 在 Urban Airship 门户上更改 bundle ID