簡體   English   中英

向Parse注冊子類時發生異常

[英]Exception while registering subclass with Parse

我有一個名為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)

從1.6.3升級到Parse的iOS SDK 1.7.5時,我遇到了同樣的問題。 問題出在我的初始化函數中,該函數看起來與您的相同。

在函數中使用dispatch_once_t作為局部變量並不能確保子類只被注冊一次。 通過在初始化函數的registerSubclass()調用上放置一個斷點,我注意到它被多次調用。 子類的不斷重新注冊顯然導致新版本的Parse SDK出現問題。

更改初始化函數看起來像這樣可以解決問題:

private static var onceToken : dispatch_once_t = 0

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

遵循該錯誤提示該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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM