mor*_*ant 5 objective-c google-data-api xcode4.3 google-provisioning-api
我已经构建了Google数据API Objective-C客户端库,并将其链接并与我的应用程序(包括GTMOAuth2)一起使用,并可以将数据拉回来.我需要使用Provisioning API(仍然只支持XML),因此我在自己的应用程序中构建了我需要的附加功能.我想我终于想出了所有这些是如何工作的,我非常接近阅读自定义元素,但我遗漏了一些东西.
我子类GDataServiceGoogle,GDataEntryBase以及GDataFeedBase和我得到正确的数据备份.我从一个简单直接的元素类型开始:quota.在Users Feed中,quota元素如下所示:
<apps:quota limit="2048"/>
Run Code Online (Sandbox Code Playgroud)
所以,我添加了以下值构造:
@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
Run Code Online (Sandbox Code Playgroud)
我已经将以下方法添加到我的GDataEntryBase子类中:
- (GDataQuotaProperty *)quota;
- (void)setQuota:(GDataQuotaProperty *)val;
Run Code Online (Sandbox Code Playgroud)
实施如下:
- (GDataQuotaProperty *)quota {
return [self objectForExtensionClass:[GDataQuotaProperty class]];
}
- (void)setQuota:(GDataQuotaProperty *)val {
[self setObject:val forExtensionClass:[GDataQuotaProperty class]];
}
Run Code Online (Sandbox Code Playgroud)
正如在注释中记录GDataObject.h(我已经工作过的GDataServiceGoogleCalendar,GDataEntryCalendar和GDataFeedCalendar作为一个参考实现),在我的GDataBaseEntry子类中,我实现addExtensionDeclarations如下:
- (void)addExtensionDeclarations {
[super addExtensionDeclarations];
Class entryClass = [self class];
// User extensions
[self addExtensionDeclarationForParentClass:entryClass
childClasses:[GDataQuotaProperty class], nil];
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试quota在回调中调用如下方法时:
GDataTextConstruct *titleTextConstruct = [user title];
NSString *title = [titleTextConstruct stringValue];
GDataQuotaProperty *quotaConstruct = [user quota];
NSString *quota = [quotaConstruct stringValue];
Run Code Online (Sandbox Code Playgroud)
我得到一个例外,这个错误:
2012-11-19 12:42:22.667 Google Apps Open Directory Sync[47679:903] -[GDataEntryBase quota]: unrecognized selector sent to instance 0x2836d0
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我确实title正确地返回了用户的名字(元素)而没有错误.此外,该user对象实际上是我的GDataEntryBase子类的类型,而不是GDataEntryBase它自己(在调试器中验证),加上classForEntries我的GDataFeedBase子类中的方法正确返回我的子类的类GDataEntryBase)所以在这两者之间它真的必须是正确的类.我的GDataEntryBase子类的quota方法有一个断点,它永远不会被绊倒,所以我在这里缺少什么?
如上所述,我一直在与Calendar的服务/ Feed/Entry实现进行比较(特别是accessLevel&color元素和方法),我只是没有看到我缺少的东西.
提前感谢您提供的任何帮助.
虽然我已经classForEntries在我的GDataFeedBase子类中实现了该方法,并且正确地从中返回了我的子类的类GDataEntryBase,如下所示:
- (Class)classForEntries {
return [GDataEntryUser class];
}
Run Code Online (Sandbox Code Playgroud)
standardKindAttributeValue我错过了在同一个子类中的实现GDataFeedBase,该子类应该返回适当的类别架构 URL(对于 Google 配置 API 用户供稿,为“http://schemas.google.com/apps/2006#user”) 。所以,我实现如下(虽然我实际上使用了一个常量):
+ (NSString *)standardKindAttributeValue {
return @"http://schemas.google.com/apps/2006#user";
}
Run Code Online (Sandbox Code Playgroud)
一旦addExtensionDeclarations、classForEntries、 和standardKindAttributeValue全部正确实现,GDataEntryBase就能够正确确定我的子类应该用于提要中的对象,因此我的选择器被识别。
非常感谢 Google 的 Greg Robbins在 Google 数据 API Objective-C 客户端库讨论组的这个帖子中为我指明了正确的方向。
| 归档时间: |
|
| 查看次数: |
339 次 |
| 最近记录: |