2015-07-31 1 views
1

Я использую KVO для свойства в подклассе PFObject, который уже зарегистрирован во время инициализации.Класс должен быть зарегистрирован в registerSubclass перед использованием Parse

Все в порядке, если я использую 1 объект. На втором объекте я получаю ошибку The class KVO_vs_PFObject.MyModel must be registered with registerSubclass before using Parse. Мне нужно несколько объектов для наблюдения за свойствами.

Я попытался использовать свойство observer(didSet) в качестве альтернативы в swift, но компилятор не позволит мне, так как я использую управляемое свойство.

Кто-нибудь знает, что происходит с этим кодом?

Ниже мой код:

import UIKit 
import Parse 

class MyModel : PFObject, PFSubclassing { 
    static func parseClassName() -> String { 
     return "MyModel" 
    } 
    override class func initialize() { 
     var onceToken : dispatch_once_t = 0; 
     dispatch_once(&onceToken) { 
      self.registerSubclass() 
     } 
    } 
    @NSManaged var property1 : String? 
} 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     var myObject = MyModel() 
     myObject.addObserver(self, forKeyPath: "property1", options: .New, context: nil) 
     myObject.property1 = "Hello" 
     myObject.removeObserver(self, forKeyPath: "property1") 

     // If I comment these 4 lines. myObject is happy observing the property. 
     var anotherObject = MyModel() 
     anotherObject.addObserver(self, forKeyPath: "property1", options: .New, context: nil) 
     anotherObject.property1 = "World" 
     anotherObject.removeObserver(self, forKeyPath: "property1") 
    } 
    override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 
     var n : AnyObject? = change["new"] 
     switch keyPath { 
     case "property1" : 
      println("observed MyModel.property1 with value \(n)") 
     default : 
      break 
     } 
    } 
} 

ответ

1

Я закончил с использованием вычисленного свойства вместо хранящегося имущества согласно связанному посту. Subclassing PFObject in Swift

// @NSManaged var property1 : String? 
 
    var property1: String? { 
 
     get { 
 
      return self["property1"] as? String 
 
     } 
 
     set { 
 
      self["property1"] = newValue 
 
      println("observed MyModel.property1 with value \(newValue)") 
 
     } 
 
    }

1

У меня есть это в моем AppDelegate в дополнение к Initialize(). Здесь были некоторые сообщения, в которых говорится, что initialize() требует запуска kick-start перед вызовом. Стоит попробовать следующее ...

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 


     // Override point for customization after application launc 

     //-----------------Parse customizations------------------------------ 


     // Enable storing and querying data from Local Datastore. 
     // Remove this line if you don't want to use Local Datastore features or want to use cachePolicy. 
     Parse.enableLocalDatastore() 

     // **************************************************************************** 
     // Uncomment this line if you want to enable Crash Reporting 
     // ParseCrashReporting.enable() 
     // 
     // Uncomment and fill in with your Parse credentials: 

     //This one is for the MyAppName Parse App 

     MyModel.registerSubclass() 

     // Rest of the stuff... 
+0

Спасибо за ответ @ Jitendra. Я попробовал appDelegate, но не работал. По-прежнему появляется ошибка при использовании с KVO во втором экземпляре. Первый экземпляр в порядке. Это просто вторая бомба. –

+0

Извините, Эдгардо, в этом случае, я не уверен, что происходит. Когда я искал инициализацию, я помню, как читал, что класс должен ссылаться один раз до вызова инициализации. от вашего наблюдения, что он работает впервые, может быть, что-то не получается после инициализации(). мой код инициализации: переопределить класс func initialize() { struct Static { static var onceToken: dispatch_once_t = 0; } dispatch_once (& Static.onceToken) { self.registerSubclass() } } –

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