Swift:Parse子类dynamic var在检索对象时不被包含
从分析数据浏览器检索对象时,无法获取对象属性。这是在我从“@nsvar-managed-var-friends”改为“dynamic-var-friends”之后发生的。甚至“name”在User.logInWithUsernameInBackground块中也显示为nil,这很疯狂,因为登录成功。用户的ACL设置为“公共读取” 用户对象:Swift:Parse子类dynamic var在检索对象时不被包含,dynamic,swift,parse-platform,subclass,pfobject,Dynamic,Swift,Parse Platform,Subclass,Pfobject,从分析数据浏览器检索对象时,无法获取对象属性。这是在我从“@nsvar-managed-var-friends”改为“dynamic-var-friends”之后发生的。甚至“name”在User.logInWithUsernameInBackground块中也显示为nil,这很疯狂,因为登录成功。用户的ACL设置为“公共读取” 用户对象: class User : PFUser, PFSubclassing { dynamic var friends:[User]! dyna
class User : PFUser, PFSubclassing {
dynamic var friends:[User]!
dynamic var name:String!
override class func load() {
self.registerSubclass()
}
}
正在检索用户和好友。println显示为零
var query = User.query()
query.includeKey("friends")
query.getObjectInBackgroundWithId(currentUser.objectId) {
(pfObject: PFObject!, error: NSError!) -> Void in
if pfObject != nil {
var user = pfObject as User
var friends = user.friends as [User]
println("friends: \(friends)") //nil
} else {
println(error)
}
}
User.logInWithUsernameInBackground(USERNAME, password:PASSWORD) {
(user: PFUser!, error: NSError!) -> Void in
if user != nil {
println("Logged in with user: \(user.name)") //nil
} else {
println(error)
}
}
登录。println显示为零
var query = User.query()
query.includeKey("friends")
query.getObjectInBackgroundWithId(currentUser.objectId) {
(pfObject: PFObject!, error: NSError!) -> Void in
if pfObject != nil {
var user = pfObject as User
var friends = user.friends as [User]
println("friends: \(friends)") //nil
} else {
println(error)
}
}
User.logInWithUsernameInBackground(USERNAME, password:PASSWORD) {
(user: PFUser!, error: NSError!) -> Void in
if user != nil {
println("Logged in with user: \(user.name)") //nil
} else {
println(error)
}
}
再深入一点,障碍似乎是对Swift中的
动态
修饰符的误解。显然,Swift中的dynamic
用于观察键值,而不是在运行时声明要定义的变量访问器(Objective-C中@dynamic的作用)
有关Swift中动态的说明,请参见此
这就是为什么@NSManaged在Objective-C中的工作方式是@dynamic
使用xCode 6.1.1,我能够在没有桥接头的情况下实现这一点,但我确实需要使用@NSManaged。以下是如何。。。只是:
import Parse
在调用模块的顶部。对于类声明.swift文件动态不起作用,因此我需要对变量类型使用@NSManaged,以使它们成功链接到解析类变量。像这样:
class PSCategory : PFObject, PFSubclassing {
override class func load() {
self.registerSubclass()
}
class func parseClassName() -> String! {
return "Category"
}
@NSManaged var Name: String
}
然后,在我的查询中,所有名称都被动态链接:
var query = PSCategory.query() // PFQuery(className: "Category")
query.cachePolicy = kPFCachePolicyCacheElseNetwork // kPFCachePolicyNetworkElseCache
query.maxCacheAge = 60 * 60 * 24 // One day, in seconds.
query.findObjectsInBackgroundWithBlock {
(categories: [AnyObject]!, error: NSError!) -> Void in
if error == nil {
for abstractCategory in categories {
let category = abstractCategory as PSCategory
NSLog("Category Name: %@", category.Name)
}
} else {
NSLog("Unable to retrieve categories from local cache or network")
}
}
为什么您要从@NSManaged切换?仅供我们参考,您是否有建议这样做的链接?谢谢回复ccwasden。也许我误解了,但@NSManaged似乎只用于核心数据:根据这篇文章,解析子类需要@NSManaged,我也读过这篇文章,是的,也许是这样,只是看起来很奇怪。谢谢!谢谢!我会坚持使用@NSManaged!;)