我试图在iOS上的Parse中继承PFUser。我可以使用以下代码创建一个子类:
// MyUser.h
#import <Parse/PFUser.h>
#import <Parse/PFObject+Subclass.h>
#import <Parse/PFFile.h>
@interface MyUser : PFUser<PFSubclassing>
@property PFFile *avatar;
...etc...
@end
// MyUser.m
#import "MyUser.h"
@implementation MyUser
@dynamic avatar;
...etc...
@end
当我致电[MyUser currentUser]
时,我回来的对象属于PFUser
类型,但不属于MyUser
类型。将其转换为MyUser*
没有帮助,它只是在我尝试使用任何自定义属性时抛出错误“无法识别的选择器发送到实例0xce9c0c0”,例如MyUser中定义的user.avatar
。
如何获取自定义类型的缓存currentUser
对象?
答案 0 :(得分:20)
密钥结果是注册子类和设置应用程序ID的顺序。
[Parse setApplicationId:@"FOO" clientKey:@"BAR"];
[MyUser registerSubclass];
导致问题发生。但是,如果在注册子类后设置应用程序ID,它将按预期工作。
[MyUser registerSubclass];
[Parse setApplicationId:@"FOO" clientKey:@"BAR"];
答案 1 :(得分:1)
在Parse中创建新类时,可以控制该类的名称。例如,假设您创建了一个名为“Armor。”的新类。
在Objective-C中创建子类时,您将创建的Objective-C类分配给Parse类。下面的代码是这个Armor子类的实现文件。正如您所看到的,Objective-C类名称为“Armor”,Parse类名称也是“Armor”。
#import "Armor.h"
#import <Parse/PFObject+Subclass.h>
@implementation Armor
@dynamic displayName;
@dynamic rupees;
@dynamic fireproof;
+ (NSString *)parseClassName {
return @"Armor";
}
@end
在这种情况下,Objective-C类名和Parse类名都是相同的。但是,情况并非必须如此。如果我要将Objective-C类的名称更改为“BrandonsAwesomeClass”,则仍可将其分配给Parse“Armor”类。如果我要创建一个BrandonsAwesomeClass的新实例,它仍然会返回Parse类类型的“Armor”
#import "BrandonsAwesomeClass.h"
#import <Parse/PFObject+Subclass.h>
@implementation BrandonsAwesomeClass
@dynamic displayName;
@dynamic rupees;
@dynamic fireproof;
+ (NSString *)parseClassName {
return @"Armor";
}
@end
在您的情况下,Parse User类始终命名为“_User”您无法更改此名称,并且Objective-C子类的名称无关紧要,它将始终返回PFUser作为类。
这对您的代码或项目没有太大影响,因为您仍然可以通过网站向Parse“_User”类添加自定义属性,并将@dynamic属性添加到Objective-C子类中。
只要您正确设置子类[MyUser currentUser] .avatar与访问[[PFUser currentUser] objectForKey:@“avatar”]
相同我已经链接到解释子类的Parse博客文章以供参考。
答案 2 :(得分:0)
试试[PFUser object]
。
[PFUser currentUser]
将返回PFUser,但[PFUser object]
如果已正确注册,则应返回您的子类。