Почему при создании подкласса 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.