2015-05-20 6 views
0

Я пытаюсь хранить данные в локальном хранилище данных с помощью 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?

ответ

1

Вот идея, которая может вам помочь в этом случае. Ваш Тест класс является подклассом PFObject. И у вас есть пользовательский объект внутри класса Test, который называется Test2.

В вашем Test2.swift файл, создать метод, который будет возвращать NSDictionary объект, содержащий все свойства его объекта. Несколько похоже на это:

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

И вы могли бы использовать этот словарь для хранения деталей объекта как объекта в вашем Test объекта. Теперь, parse поддерживает словарь, и вы преобразовали его в словаре. Это спасло бы объект.

Теперь добавьте еще один метод в ваш быстрый файл для создания объекта на основе значений словаря.

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 вызове метода инициализации этого объекта и создать объект со значениями словаря вы получите от синтаксического анализа.

Надеюсь, моя идея поможет вам. :)

+0

Спасибо за альтернативное предложение. У меня было альтернативное решение в виду, похоже, но я удаляю NSManaged из свойства test2: Test2 в Test и используя геттеры и сеттеры на нем. Затем я создаю словарь, который является NSManaged, который работает с getter и setter. Очевидно, что это немного хакерское решение, и я надеялся найти решение, в котором объекты могут быть вложены. (Я предполагаю, что вы предлагали альтернативное решение, в котором вы либо верите, что вложенные объекты в синтаксическом выражении либо не возможны, либо вы не знаете, как это возможно) Спасибо в любом случае за вашу помощь –

Смежные вопросы