我正在尝试使用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子类中组成一个自定义对象?
答案 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方法,并使用从解析中获得的字典值创建对象。
希望,我的想法可以帮助你...... :)