在对PFUser进行子类化时获得正确的类型



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

关键是注册子类和设置应用程序ID的顺序。

[Parse setApplicationId:@"FOO" clientKey:@"BAR"];
[MyUser registerSubclass];

导致问题发生。但是,如果在注册子类之后设置应用程序ID,它将按预期工作。

[MyUser registerSubclass];
[Parse setApplicationId:@"FOO" clientKey:@"BAR"];

当您在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/

尝试[PFUser object]

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

最新更新