我正在尝试使用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中得到的字典值创建对象。
希望我的想法对你有帮助。:)