Я пытаюсь хранить данные в локальном хранилище данных с помощью parse.com (1.7.3) в Swift iOS. Следуя parse.com docs here, я могу подклассировать PFObject для хранения простого объекта. Однако я надеюсь создать собственный объект внутри этот объект, и я нахожу трудности в этом.(iOS Swift parse.com) - Можно сохранить пользовательский объект в подклассе PFObject?
Я отменил эту проблему до ее самой простой и включил мой код ниже. В основном я храню подкласс PFObject под названием «Тест», который будет хранить String (testString) и настраиваемый объект Test2. Test2 в свою очередь также сохранит String (testString). Я предполагаю, что Test2 также нуждается в подклассе PFObject.
Test - testString(String)
- test2(Test2)
- testString(String)
AppDelegate.swift
(регистрация подкласса в AppDelegate вместо Инициализировать метод - см 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)
}
}
}
}
})
}
Так Println в LoadTest выводит следующее в консоли:
<Test: 0x7ff2da75e810, objectId: new, localId: local_15a085d00030543f> {
test2 = "<Test2: 0x7ff2db90fe50, objectId: new>";
testString = "I am Test";
}
Если я пытаюсь для доступа к свойству test2 или свойство test2, приложение зависает. Я также не могу «получить» объект Test. Любопытно Если я загружаю какие-либо объекты TEST2 хранятся локально (идентичен способу LoadTest выше с любым упоминанием испытаний заменен Test2), я сделать найти объект Test2:
<Test2: 0x7f94b1f1e850, objectId: new, localId: (null)> {
testString = "I am Test 2";
}
Таким образом, в прикалывая тестовый объект, test2 также закрепляется. Однако объект test2 по какой-то причине не подключается к тестовому объекту.
Я начинаю заблуждаться и не могу найти подходящую (или точную) документацию или образцы проектов, которые, вероятно, очистят все это за секунду ... Каков наилучший подход (если таковой имеется) для создания пользовательского объекта внутри подкласса PFObject?
Спасибо за альтернативное предложение. У меня было альтернативное решение в виду, похоже, но я удаляю NSManaged из свойства test2: Test2 в Test и используя геттеры и сеттеры на нем. Затем я создаю словарь, который является NSManaged, который работает с getter и setter. Очевидно, что это немного хакерское решение, и я надеялся найти решение, в котором объекты могут быть вложены. (Я предполагаю, что вы предлагали альтернативное решение, в котором вы либо верите, что вложенные объекты в синтаксическом выражении либо не возможны, либо вы не знаете, как это возможно) Спасибо в любом случае за вашу помощь –