Почему при создании подкласса GDataEntryBase из клиентской библиотеки Google Data Objective-C я получаю ошибки "нераспознанный селектор"?

Я создал клиентскую библиотеку Objective-C API данных Google, и она связывает и работает с моим приложением (включая GTMOAuth2) и может извлекать данные обратно. Мне нужно работать с Provisioning API (все еще только для XML), поэтому я создаю необходимые мне дополнения в своем собственном приложении. Я думаю, что я наконец понял, как все это работает, и я очень близок к чтению пользовательских элементов, но я что-то упускаю.

Я подкласс GDataServiceGoogle, GDataEntryBase, а также GDataFeedBase и я получаю правильные данные обратно. Я начинаю с простого и простого типа элемента: quota, В фиде Users элемент quota выглядит следующим образом:

<apps:quota limit="2048"/>

Итак, я добавил следующую конструкцию значения:

@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

И я добавил следующие методы в мой GDataEntryBase подкласс:

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

Реализуется следующим образом:

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

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

Как указано в комментариях вGDataObject.h (и я работал над GDataServiceGoogleCalendar, GDataEntryCalendar, а также GDataFeedCalendar в качестве эталонной реализации), по моему GDataBaseEntry подкласс я реализовал addExtensionDeclarations следующее:

- (void)addExtensionDeclarations {
    [super addExtensionDeclarations];

    Class entryClass = [self class];

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

Тем не менее, когда я пытаюсь позвонить quota метод следующим образом в моем обратном вызове:

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

Я получаю исключение и эту ошибку:

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

В приведенном выше примере я получаю имя пользователя (элемент titleВернитесь правильно без ошибок. Так же user объект на самом деле типа моего GDataEntryBase подкласс, не GDataEntryBase сам (проверено в отладчике), плюс classForEntries метод в моем GDataFeedBase Подкласс правильно возвращает класс моего подкласса GDataEntryBase) так что между двумя из них действительно должен быть правильный класс. У меня есть точка останова на моем GDataEntryBase подкласса quota метод, который никогда не срабатывает, так что мне здесь не хватает?

Как уже упоминалось, я сравнивал с реализацией Service/Feed/Entry для Calendar (в частности, accessLevel & color элементы и методы) и я просто не вижу, что мне не хватает.

Заранее благодарим за любую помощь, которую вы можете оказать.

1 ответ

Решение

Пока я реализовал classForEntries метод в моем GDataFeedBase подкласс и правильно возвращал класс моего GDataEntryBase Подкласс от него, следующим образом:

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

Я пропустил реализацию standardKindAttributeValue В то же самое GDataFeedBase подкласс, который должен был возвращать соответствующий URL-адрес схемы категории ("http://schemas.google.com/apps/2006#user" в случае пользовательских каналов API предоставления Google). Итак, я реализовал следующим образом (хотя на самом деле я использую константу):

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

однажды addExtensionDeclarations, classForEntries, а также standardKindAttributeValue все были реализованы правильно, GDataEntryBase смог правильно определить, что мой подкласс должен использоваться для объектов в ленте, и поэтому мои селекторы были распознаны.

Большое спасибо Грегу Роббинсу из Google за то, что он указал мне правильное направление в этой теме в дискуссионной группе клиентских библиотек Google Data APIs Objective-C.

Другие вопросы по тегам