5

我已经构建了Google Data APIs Objective-C 客户端库,并让它链接并与我的应用程序(包括 GTMOAuth2)一起工作,并且可以拉回数据。我需要使用Provisioning API(仍然只有 XML),所以我在自己的应用程序中构建了我需要的附加功能。我想我终于弄清楚了所有这些是如何工作的,并且我非常接近阅读自定义元素,但我错过了一些东西。

我已经对 , 进行了子类化GDataServiceGoogleGDataEntryBase并且GDataFeedBase正在获取正确的数据。我从一个简单直接的元素类型开始: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,在我的子类中,我实现如下:GDataServiceGoogleCalendarGDataEntryCalendarGDataFeedCalendarGDataBaseEntryaddExtensionDeclarations

- (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方法上有一个断点,它永远不会被绊倒,那么我在这里缺少什么?

如前所述,我一直在与 Calendar 的 Service/Feed/Entry 实现(特别是accessLevel&color元素和方法)进行比较,只是没有看到我缺少的内容。

提前感谢您提供的任何帮助。

4

1 回答 1

1

虽然我已经classForEntries在我的子类中实现了该方法GDataFeedBase并从中正确返回了我的子类的GDataEntryBase类,如下所示:

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

我错过了standardKindAttributeValue在同一GDataFeedBase个子类中的实现,它应该返回适​​当的类别架构 URL(在 Google Provisioning API 用户提要的情况下为“http://schemas.google.com/apps/2006#user”) . 所以,我实现如下(虽然我实际上使用了一个常量):

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

一旦addExtensionDeclarations,classForEntriesstandardKindAttributeValue都正确实现,GDataEntryBase就能够正确确定我的子类应该用于提要中的对象,因此我的选择器被识别。

非常感谢 Google 的 Greg Robbins在 Google Data APIs Objective-C Client Libraries 讨论组的这个线程中为我指明了正确的方向。

于 2012-11-20T19:43:08.270 回答