在子类化PFUser时获取正确的类型

时间:2014-03-05 16:37:21

标签: ios objective-c subclass parse-platform

我试图在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对象?

3 个答案:

答案 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博客文章以供参考。

http://blog.parse.com/2013/03/22/stay-classy-objective-c-introducing-native-subclasses-for-parse-objects/

答案 2 :(得分:0)

试试[PFUser object]

[PFUser currentUser]将返回PFUser,但[PFUser object]如果已正确注册,则应返回您的子类。