2015-07-02 2 views
1

У меня есть класс под названием Attendee, который наследует от PFObject. В моем applicationDidFinishLaunching() методе я зарегистрировать подкласс так:Исключение при регистрации подкласса с парсером

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    Attendee.initialize() 
    Parse.enableLocalDatastore() 
    Parse.setApplicationId(ObjectManager.appID, clientKey: ObjectManager.clientKey) 

    getData() 

    return true 
} 

func getData() { 
    //create the query 
    var attendeeQuery = Attendee.query() 
    attendeeQuery?.fromLocalDatastore() 
     .fromPinWithName(CacheKeys.AttendeesKey) 
     .whereKey("conference", equalTo: ObjectManager.currentConf) 

    //register a background task 
    var bgTask = UIBackgroundTaskInvalid 
    bgTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({() -> Void in 
     UIApplication.sharedApplication().endBackgroundTask(bgTask) 
     bgTask = UIBackgroundTaskInvalid 

     println("Attendees Loader Expiration Handler called") 
    }) 

    //run the query 
    attendeeQuery?.findObjectsInBackgroundWithBlock({ (cachedAttendees: [AnyObject]?, error:NSError?) -> Void in 
     if error != nil { 
      println(error) 
      return 
     } 

     ... 

      UIApplication.sharedApplication().endBackgroundTask(bgTask) 
     }) 
    }) 
} 

Однако, когда я запускаю код, я получаю исключение на линии var attendeeQuery = Attendee.query(). Исключение говорит, что мне нужно зарегистрировать подкласс класса Attendee, прежде чем использовать его. Я не понимаю, почему это говорит о том, что, поскольку я регистрирую его заранее. Ниже приведено определение класса Attendee.

class Attendee: PFObject, PFSubclassing { 

    var name:String 
     { 
      return self["name"] as! String 
    } 

    ... 

    override class func initialize() { 
     var onceToken : dispatch_once_t = 0; 
     dispatch_once(&onceToken) { 
      self.registerSubclass() 
     } 
    } 

    class func parseClassName() -> String { 
     return Classes.Attendee 
    } 
} 

Исключение:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'The class MedConf.Attendee must be registered with registerSubclass before using Parse.' 
*** First throw call stack: 
(0x1835002d8 0x194d240e4 0x183500218 0x1001e21d0 0x1001e1fac 0x100135d88 0x100138af0 0x1000e43e0 0x1000e4580 0x187fb3190 0x1881ca854 0x1881cd208 0x1881cb778 0x18bd093c8 0x1834b827c 0x1834b7384 0x1834b59a8 0x1833e12d4 0x187fac43c 0x187fa6fac 0x1000e7b48 0x1953a2a08) 
+0

'Classes.Attendee' возвращает строку' "Attendee" '? – kRiZ

+0

Да, он возвращает «Attendee» 'struct Classes {static let Attendee =" Attendee "}' – Satre

+0

Я переживаю такую ​​же проблему после недавнего обновления из библиотеки разбора 1.6.3 до 1.7.5. Могли ли вы определить, в чем причина вашего приложения? – Greg

ответ

1

У меня была такая же проблема, когда я перешел на iOS SDK 1.7.1 от 1.6.3. Проблема была в моей функции инициализации, которая выглядела так же, как ваша.

Использование dispatch_once_t как локального var в функции не служит для обеспечения того, чтобы подкласс регистрировался ровно один раз; Я заметил, поставив точку останова на вызов registerSubclass() в функции initialize, которую он вызывал много раз. Постоянная перерегистрация подкласса, по-видимому, вызывала проблемы для новой версии Parse SDK.

Изменение функции инициализации, чтобы выглядеть следующим образом исправлена ​​проблема:

private static var onceToken : dispatch_once_t = 0 

override class func initialize() { 
    dispatch_once(&onceToken) { 
     self.registerSubclass() 
    } 
} 
0

насчет следующее сообщение об ошибке, которое говорит must be registered with registerSubclass

Таким образом, вы должны вызвать registerSubclass метод вместо initialize

Так вот код, который :

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    Attendee.registerSubclass() 
    Parse.enableLocalDatastore() 
    Parse.setApplicationId(ObjectManager.appID, clientKey: ObjectManager.clientKey) 

    getData() 

    return true 
} 
+0

Да, но метод initialize() сам вызывает registerSubclass() – Satre

+0

Я вижу это, но в моем случае это сработало;) @Satre – siegy22

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