2014-03-05 10 views
7

Ich versuche, PFUser in Parse auf iOS zu unterklassen. Ich kann eine Unterklasse erstellen, mit dem folgenden Code:Ermitteln des richtigen Typs beim Unterklassen-Erstellen von 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 

Als ich [MyUser currentUser] nennen, das Objekt, das ich zurück vom Typ erhalten PFUser, aber ist nicht vom Typ MyUser. Casting es zu MyUser* hilft nicht, es wirft nur den Fehler "unerkannter Selektor an Instanz 0xce9c0c0 gesendet", wenn ich versuche, eine der benutzerdefinierten Eigenschaften, z. user.avatar, die in MyUser definiert ist.

Wie kann ich das zwischengespeicherte Objekt currentUser meines benutzerdefinierten Typs abrufen?

+0

Was ist der Rest Ihrer Implementierung? Rufen Sie 'registerSubclass' an? – Wain

+0

Ich rufe 'registerSubclass' im App-Delegaten auf.Der Rest der Implementierung ist nicht wirklich wichtig, wenn ich nicht den richtigen Typ zurückbekomme. – tghw

+0

Setzen Sie parseClassName? Wenn ja, solltest du nicht. – Moonwalkr

Antwort

20

Der Schlüssel stellte sich als die Reihenfolge der Registrierung von Unterklassen und die Festlegung der Anwendungs-ID heraus.

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

Das Problem tritt auf. Wenn Sie jedoch die Anwendungs-ID nach dem Registrieren von Unterklassen festlegen, funktioniert es wie erwartet.

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

Das macht keinen Sinn, aber es funktioniert! Vielen Dank. – NatashaTheRobot

1

Wenn Sie eine neue Klasse in Parse erstellen, steuern Sie den Namen dieser Klasse. Angenommen, Sie erstellen eine neue Klasse mit dem Namen "Armor".

Wenn Sie eine Unterklasse in Objective-C erstellen, weisen Sie die erstellte Objective-C-Klasse der Parse-Klasse zu. Der folgende Code ist die Implementierungsdatei für diese Armor-Unterklasse. Wie Sie sehen können, ist der Objective-C-Klassenname "Armor" und der Parse-Klassenname ist auch "Armor".

#import "Armor.h" 
#import <Parse/PFObject+Subclass.h> 

@implementation Armor 
@dynamic displayName; 
@dynamic rupees; 
@dynamic fireproof; 
+ (NSString *)parseClassName { 
    return @"Armor"; 
} 
@end 

In diesem Fall sind der Objective-C-Klassenname und der Parse-Klassenname identisch. Dies muss jedoch nicht der Fall sein. Wenn ich den Namen meiner Objective-C-Klasse in "BrandonsAwesomeClass" ändern würde, könnte dies immer noch der Parse "Armor" -Klasse zugeordnet werden. Wenn ich eine neue Instanz von BrandonsAwesomeClass zu schaffen wäre, würde es immer noch den Parse-Klasse Typs „Rüstung“ Rückkehr

#import "BrandonsAwesomeClass.h" 
#import <Parse/PFObject+Subclass.h> 

@implementation BrandonsAwesomeClass 
@dynamic displayName; 
@dynamic rupees; 
@dynamic fireproof; 
+ (NSString *)parseClassName { 
    return @"Armor"; 
} 
@end 

In Ihrem Fall wird die Parse User-Klasse immer den Namen „_User“ Sie diesen Namen nicht ändern können und Es spielt keine Rolle, was der Name Ihrer Objective-C-Unterklasse ist, es wird immer PFUser als Klasse zurückgeben.

Dies hat nicht wirklich Auswirkungen auf Ihren Code oder Ihr Projekt, da Sie der Parse "_User" -Klasse über die Website weiterhin benutzerdefinierte Eigenschaften hinzufügen und der Objective-C-Unterklasse die @dynamic-Eigenschaften hinzufügen können.

Solange Sie Ihre Unterklasse richtig eingestellt [MyUser current] .avatar ist die gleiche wie den Zugriff auf [[PFUser current] objectForKey: @ „Avatar“]

ich dem Parse Blogeintrag verknüpft haben erklärt, Unterklassen als Referenz.

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

0

Versuchen [PFUser object].

[PFUser currentUser] wird PFUser zurückgeben, aber [PFUser object] sollte Ihre Unterklasse zurückgeben, wenn sie korrekt registriert ist.

+0

Warum wurde das abgelehnt? Überprüfen Sie diese offizielle Antwort von Parse.com: https://parse.com/questions/subclass-pfuser – Moonwalkr

+0

'[PFUser Objekt]' gibt den zwischengespeicherten aktuellen Benutzer nicht zurück und ist daher viel weniger nützlich, da es dann sein muss vom Server getrennt abgerufen. Unabhängig davon sollte ich in der Lage sein, mit der Unterklasse zu arbeiten und '' MyUser currentUser] 'den richtigen Typ zurückgeben. Meine Antwort zeigt, wie man das macht. – tghw