我有以下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";
}])
我错过了什么吗?重启应用程序后,为什么不返回正确类的对象?
答案 0 :(得分:2)
好的,所以我在根视图控制器的viewDidLoad
方法中运行查询。查看PFSubclassing
的{{1}}文档:
@warning必须在&lt; [Parse。之前]调用此方法 setApplicationId:clientKey:]&GT;
根据Parse文档中的示例,我覆盖了registerSubclass
方法,但是在创建查询时,但在调用initialize
的{{1}}方法之前调用此方法
所以关键是稍后运行查询,或者先注册子类!
答案 1 :(得分:0)
问题是您没有将对象保存到Parse database
,只保存到device
,因此该对象实际上还没有created
。 pinInBackground()
仅保存到device
,而saveInBackground()
保存到Parse数据库,从而实际创建对象。如果使用.saveEventually(),则会固定,直到可以访问网络以保存到Parse数据库。但一般情况下 - 您实际上不会通过保存到您的设备来创建对象,它必须保存到Parse数据库才能创建。