Parse查询在重启时返回PFObject而不是子类

时间:2015-06-01 12:21:13

标签: ios swift parse-platform

我有以下PFObject子类:

class Show: PFObject, PFSubclassing {

    @NSManaged var date: NSDate

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

    static func parseClassName() -> String {
        return "Show"
    }
}

然后我可以添加新的Show对象,如下所示:

let newShow = Show()
newShow.date = NSDate()
newShow.pinInBackground()

查询Show个对象。

let query = Show.query()!
query.fromLocalDatastore()
query.orderByAscending("date")
query.findObjectsInBackgroundWithBlock { (shows, error) -> Void in

    println("shows:\(shows)")

    let myShows = shows as? [Show]

    println("myShows:\(myShows)")

    let myObjects = shows as? [PFObject]

    println("myObjects:\(myObjects)")
}

按预期返回[Show]

shows:Optional([<Show: 0x7fde6a8ba0f0, objectId: new, localId: local_90293157b4a20c5c> {
    date = "2015-06-01 12:08:16 +0000";
}])

myShows:Optional([<Show: 0x7fde6a8ba0f0, objectId: new, localId: local_90293157b4a20c5c> {
    date = "2015-06-01 12:08:16 +0000";
}])

myObjects:Optional([<Show: 0x7fde6a8ba0f0, objectId: new, localId: local_90293157b4a20c5c> {
    date = "2015-06-01 12:08:16 +0000";
}])

但是,如果我终止该应用,然后重新运行相同的查询,则生成的数组为[PFObject]而不是[Show]

shows:Optional([<Show: 0x7fef632ca2b0, objectId: new, localId: local_c6995edd73e73e10> {
    date = "2015-06-01 12:08:16 +0000";
}])

myShows:nil

myObjects:Optional([<Show: 0x7fef632ca2b0, objectId: new, localId: local_c6995edd73e73e10> {
    date = "2015-06-01 12:08:16 +0000";
}])

我错过了什么吗?重启应用程序后,为什么不返回正确类的对象?

2 个答案:

答案 0 :(得分:2)

好的,所以我在根视图控制器的viewDidLoad方法中运行查询。查看PFSubclassing的{​​{1}}文档:

  

@warning必须在&lt; [Parse。之前]调用此方法   setApplicationId:clientKey:]&GT;

根据Parse文档中的示例,我覆盖了registerSubclass方法,但是在创建查询时,但在调用initialize的{​​{1}}方法之前调用此方法

所以关键是稍后运行查询,或者先注册子类!

答案 1 :(得分:0)

问题是您没有将对象保存到Parse database,只保存到device,因此该对象实际上还没有createdpinInBackground()仅保存到device,而saveInBackground()保存到Parse数据库,从而实际创建对象。如果使用.saveEventually(),则会固定,直到可以访问网络以保存到Parse数据库。但一般情况下 - 您实际上不会通过保存到您的设备来创建对象,它必须保存到Parse数据库才能创建。