5

Ich habe die Google Data APIs Objective-C Client Library gebaut und habe es mit meiner Anwendung verknüpfen und arbeiten (inkl. GTMOAuth2) und kann Daten zurückziehen. Ich muss mit der Provisioning API (noch XML-only) arbeiten, also baue ich die Zusätze aus, die ich innerhalb meiner eigenen Anwendung benötige. Ich denke, ich habe endlich herausgefunden, wie das alles funktioniert und ich bin sehr nahe an benutzerdefinierten Elementen zu lesen, aber ich vermisse etwas.Warum erhalte ich bei der Unterklassierung von GDataEntryBase aus der Google Data Objective-C-Clientbibliothek "nicht erkannte Selektorfehler"?

Ich habe GDataServiceGoogle, GDataEntryBase und GDataFeedBase unterklassifiziert und erhalte korrekte Daten zurück. Ich beginne mit einem einfachen & einfachen Elementtyp: quota. In den Nutzer füttern, wie dies die Quote Element aussieht:

folgenden Wert Konstrukt Also, ich habe hinzugefügt:

@interface GDataQuotaProperty : GDataValueConstruct <GDataExtension> 
+ (NSString *)extensionElementURI; 
+ (NSString *)extensionElementPrefix; 
+ (NSString *)extensionElementLocalName; 
@end 

@implementation GDataQuotaProperty 
+ (NSString *)extensionElementURI  { return kGDataNamespaceGApps; } 
+ (NSString *)extensionElementPrefix { return kGDataNamespaceGAppsPrefix; } 
+ (NSString *)extensionElementLocalName { return @"quota"; } 
@end 

Und ich habe die folgenden Methoden zu meiner GDataEntryBase Unterklasse hinzugefügt:

- (GDataQuotaProperty *)quota; 
- (void)setQuota:(GDataQuotaProperty *)val; 

wie folgt umgesetzt:

- (GDataQuotaProperty *)quota { 
    return [self objectForExtensionClass:[GDataQuotaProperty class]]; 
} 

- (void)setQuota:(GDataQuotaProperty *)val { 
    [self setObject:val forExtensionClass:[GDataQuotaProperty class]]; 
} 

Als documented in the comments in GDataObject.h (und ich habe aus der GDataServiceGoogleCalendar arbeiten, GDataEntryCalendar und GDataFeedCalendar als Referenz-Implementierung), meiner GDataBaseEntry Unterklasse habe ich umgesetzt addExtensionDeclarations wie folgt:

- (void)addExtensionDeclarations { 
    [super addExtensionDeclarations]; 

    Class entryClass = [self class]; 

    // User extensions 
    [self addExtensionDeclarationForParentClass:entryClass 
            childClasses:[GDataQuotaProperty class], nil]; 
} 

aber wenn ich versuche, die quota Methode aufzurufen, wie in meinem Rückruf folgt:

GDataTextConstruct *titleTextConstruct = [user title]; 
NSString *title = [titleTextConstruct stringValue]; 
GDataQuotaProperty *quotaConstruct = [user quota]; 
NSString *quota = [quotaConstruct stringValue]; 

ich erhalte eine Ausnahme und diesen Fehler:

2012-11-19 12:42:22.667 Google Apps Open Directory Sync[47679:903] -[GDataEntryBase quota]: unrecognized selector sent to instance 0x2836d0 

Im obigen Beispiel bekomme ich den Benutzernamen (title des Elements) fehlerfrei zurück. Auch das user Objekt ist tatsächlich von der Art meiner GDataEntryBase Unterklasse, nicht GDataEntryBase selbst (im Debugger verifiziert), plus die classForEntries Methode in meiner GDataFeedBase Unterklasse gibt die Klasse meiner Unterklasse von GDataEntryBase korrekt zurück, so zwischen den beiden davon wirklich muss die richtige Klasse sein. Ich habe einen Breakpoint auf meiner GDataEntryBase Unterklasse quota Methode, die nie ausgelöst wird, also was fehlt mir hier?

Wie bereits erwähnt, habe ich für Kalender mit dem Service/Futtermittel/Eintrag Implementierung wurde Vergleich (insbesondere die accessLevel & color Elemente und Methoden) und bin einfach nicht sehen, was mir fehlt.

Vielen Dank im Voraus für jede Hilfe, die Sie zur Verfügung stellen können.

+2

+1, weil dies eine ziemlich gut geformte und detaillierte Frage ist, und mein erster Gedanke ist, dass die Bibliothek nach der Basis "GDataQuotaProperty" Klasse sucht und nichts über Ihre Unterklasse weiß. Dies könnte etwas sein, was mit einer Kategorie erreicht werden könnte, ich weiß nicht. Ich muss darüber noch etwas nachdenken. –

+0

Danke, ich stimme zu, dass es möglich ist, dass die Basisklasse die Unterklasse nicht finden kann. Ich habe ein paar andere Beispiele von Personen gefunden, die die Google Data Objective-C-Bibliotheken verwenden und ähnliche "unerkannte Selektor" -Fehler erhalten, die durch Beheben von Verknüpfungsproblemen behoben wurden. Das ist etwas, das ich in Betracht gezogen habe (obwohl "GDataObject.h" angibt). Der wahre Zweck von Erweiterungen besteht darin, Elementen zu erlauben, Kinder zu enthalten, von denen sie vielleicht nichts wissen "). – morgant

+0

Ich habe die Frage mit ein paar weiteren Erläuterungen aktualisiert, insb. in Bezug auf die Variable 'user' in' [user quota] 'Beispielaufruf. – morgant

Antwort

1

Während ich die classForEntries Methode in meiner GDataFeedBase Unterklasse implementiert war und richtig die Klasse meiner GDataEntryBase Unterklasse von ihr zurückkehrt, wie folgt:

- (Class)classForEntries { 
    return [GDataEntryUser class]; 
} 

ich die Implementierung von standardKindAttributeValue in der gleichen GDataFeedBase Unterklasse verpasst hatte , die die entsprechende Kategorieschema-URL zurückgegeben haben sollte ("http://schemas.google.com/apps/2006#user" im Fall von Google Provisioning API User-Feeds). Also, ich wie folgt implementiert (obwohl ich eigentlich eine Konstante verwenden):

+ (NSString *)standardKindAttributeValue { 
    return @"http://schemas.google.com/apps/2006#user"; 
} 

Sobald addExtensionDeclarations, classForEntries und standardKindAttributeValue alle korrekt implementiert wurden, GDataEntryBase der Lage war, richtig zu bestimmen, dass meine Unterklasse für die Objekte verwendet werden soll in das Futter und so wurden meine Selektoren erkannt.

Vielen Dank an Greg Robbins von Google für die Ausrichtung in die richtige Richtung in this thread on the Google Data APIs Objective-C Client Libraries discussion group.