5

Tôi đã xây dựng Google Data APIs Objective-C Client Library và yêu cầu nó liên kết và làm việc với ứng dụng của tôi (bao gồm GTMOAuth2) và có thể lấy lại dữ liệu. Tôi cần phải làm việc với Provisioning API (vẫn là chỉ XML) để xây dựng các bổ sung tôi cần trong ứng dụng của riêng tôi. Tôi nghĩ rằng cuối cùng tôi đã tìm ra cách tất cả các công trình này và tôi là rất gần để đọc các yếu tố tùy chỉnh, nhưng tôi thiếu một số thứ.Tại sao tôi nhận được lỗi "chọn không xác định" khi phân lớp GDataEntryBase khỏi Thư viện khách hàng dữ liệu của Google-C?

Tôi đã được phân loại là GDataServiceGoogle, GDataEntryBaseGDataFeedBase và tôi sẽ nhận lại dữ liệu chính xác. Tôi bắt đầu với một loại phần tử đơn giản & đơn giản: quota. Trong Người dùng ăn, yếu tố hạn ngạch trông như thế này:

Vì vậy, tôi đã thêm các cấu trúc giá trị sau:

@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 

Và tôi đã thêm các phương pháp sau để GDataEntryBase lớp con của tôi:

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

thực hiện như sau:

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

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

Như documented in the comments in GDataObject.h (và tôi đã làm việc tắt của GDataServiceGoogleCalendar, GDataEntryCalendar, và GDataFeedCalendar như một tài liệu tham khảo thực hiện), trong GDataBaseEntry lớp con của tôi, tôi đã thực hiện addExtensionDeclarations như sau:

- (void)addExtensionDeclarations { 
    [super addExtensionDeclarations]; 

    Class entryClass = [self class]; 

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

Tuy nhiên, khi tôi cố gắng để gọi phương thức quota như sau trong callback của tôi:

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

tôi nhận được một ngoại lệ và lỗi này:

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

Trong ví dụ trên, tôi lấy tên của người dùng (phần tử title) quay lại chính xác mà không có lỗi. Ngoài ra, đối tượng user thực sự thuộc loại lớp con GDataEntryBase của tôi, không phải là GDataEntryBase chính nó (được xác minh trong trình gỡ rối), cộng với phương thức classForEntries trong lớp con GDataFeedBase trả về chính xác lớp con của tôi là GDataEntryBase). thực sự phải là lớp chính xác. Tôi có điểm ngắt trên phương thức quota của lớp con không bao giờ bị vấp ngã, vậy tôi đang thiếu gì ở đây?

Như đã đề cập, tôi đã được so sánh với các dịch vụ/Thức ăn/thực hiện Entry for Lịch (đặc biệt là accessLevel & color yếu tố và phương pháp) và đang chỉ không nhìn thấy những gì tôi đang mất tích.

Cảm ơn trước vì bất kỳ hỗ trợ nào bạn có thể cung cấp.

+2

+1 vì đây là một câu hỏi được hình thành tốt và chi tiết, và suy nghĩ đầu tiên của tôi là thư viện đang tìm lớp cơ sở "' GDataQuotaProperty' "và không biết gì về lớp con của bạn. Điều này có thể là một cái gì đó mà * có thể * được thực hiện với một thể loại, tôi không biết. Tôi sẽ phải suy nghĩ về điều này nhiều hơn một chút. –

+0

Cảm ơn, tôi đồng ý rằng có khả năng là lớp cơ sở không thể tìm thấy lớp con. Tôi đã tìm thấy một vài ví dụ khác về những người sử dụng thư viện Google Data Objective-C và nhận được các lỗi "không được nhận dạng" tương tự đã được giải quyết bằng cách sửa các vấn đề liên kết, vì vậy đó là điều tôi đã cân nhắc (mặc dù trạng thái 'GDataObject.h'" Mục đích thực sự của các phần mở rộng là cho phép các phần tử chứa các trẻ em mà chúng có thể không biết về "). – morgant

+0

Tôi đã cập nhật câu hỏi với một số giải thích rõ ràng hơn, đặc biệt. đối với biến 'user' trong cuộc gọi ví dụ' [user quota] '. – morgant

Trả lời

1

Trong khi tôi đã thực hiện phương pháp classForEntries trong GDataFeedBase lớp con của tôi và đã trở về đúng lớp của GDataEntryBase lớp con của tôi từ nó, như sau:

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

Tôi đã bỏ lỡ việc thực hiện standardKindAttributeValue trong cùng GDataFeedBase lớp con , lẽ ra phải trả về URL lược đồ danh mục thích hợp ("http://schemas.google.com/apps/2006#user" trong trường hợp nguồn cấp dữ liệu Người dùng API cấp phép của Google). Vì vậy, tôi thực hiện như sau (mặc dù tôi thực sự sử dụng một hằng số):

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

Khi addExtensionDeclarations, classForEntries, và standardKindAttributeValue đều thực hiện một cách chính xác, GDataEntryBase đã có thể xác định một cách chính xác rằng lớp con của tôi nên được sử dụng cho các đối tượng trong nguồn cấp dữ liệu và do đó công cụ chọn của tôi đã được công nhận.

Rất cám ơn Greg Robbins của Google đã chỉ cho tôi đúng hướng in this thread on the Google Data APIs Objective-C Client Libraries discussion group.

Các vấn đề liên quan