2014-04-25 8 views
-1

Я использую файлы дисков Google в своем приложении. Доступ к файлам, загрузка файлов, загрузка файлов работают как прелесть. Теперь я пытаюсь сохранить информацию GTLDriveFile на локальном (pList), используя NSCoding. Можете ли вы помочь мне, чтобы сохранить эту информацию в Plist или предложить лучший способ сохранить эту информацию в местныхКак сериализовать/десериализовать объект GTLDriveFile в pList

Выполняемые:

  1. Google Authentication - сделано
  2. запрашивая файлы - сделать
  3. Попытка чтобы сохранить всю информацию о файлах в Plist - теперь я здесь

Пожалуйста, обратитесь по ссылке для GTLDriveFile класса STRU cture https://developers.google.com/drive/ios/reference/ios-client/interface_g_t_l_drive_file

Я пробовал таким образом, но я не смог сохранить всю структуру.

Для Ex: .h файл

#import "GTLDriveFile.h" 

@interface sample : GTLDriveFile <NSCoding> 

@end 

файл .m

#import "sample.h" 

@implementation sample 

//@synthesize File; 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if(self = [super init]) { 
     super.fileSize=[aDecoder decodeObjectForKey:@"fileSize"]; 
     super.originalFilename=[aDecoder decodeObjectForKey:@"originalFilename"]; 
     super.mimeType=[aDecoder decodeObjectForKey:@"mimeType"]; 
     super.title=[aDecoder decodeObjectForKey:@"title"]; 
     **super.parents=[aDecoder decodeObjectForKey:@"parents"];** 
     super.lastModifyingUserName=[aDecoder decodeObjectForKey:@"lastModifyingUserName"]; 
     **super.copyable=[aDecoder decodeObjectForKey:@"copyable"];** 
     super.kind=[aDecoder decodeObjectForKey:@"kind"]; 
     super.writersCanShare=[aDecoder decodeObjectForKey:@"writersCanShare"]; 
     **super.appDataContents=[aDecoder decodeObjectForKey:@"appDataContents"]; 
     super.modifiedDate=[aDecoder decodeObjectForKey:@"modifiedDate"];** 
    } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder 
{ 
    [encoder encodeObject: super.fileSize forKey:@"fileSize"]; 
    [encoder encodeObject: super.originalFilename forKey:@"originalFilename"]; 
    [encoder encodeObject: super.mimeType forKey:@"mimeType"]; 
    [encoder encodeObject: super.title forKey:@"title"]; 
    **[encoder encodeObject: super.parents forKey:@"parents"];** 
    [encoder encodeObject: super.lastModifyingUserName forKey:@"lastModifyingUserName"]; 
    **[encoder encodeObject:copyable forKey:@"copyable"];** 
    [encoder encodeObject: super.kind forKey:@"kind"]; 
    [encoder encodeObject: super.writersCanShare forKey:@"writersCanShare"]; 
    **[encoder encodeObject:appDataContents forKey:@"appDataContents"];** 
    **[encoder encodeObject: super.modifiedDate forKey:@"modifiedDate"];** 
} 

@end 

Проблема была, я не мог сериализации/десериализации прямые значения, как NSString, NSNumber и т.д. Когда я пытаюсь использовать какой-то базовый объект, например «скопируемый», я получаю исключение (пожалуйста, обратитесь к выделенным жирным объектам или обратитесь к ссылке класса GTLDriveFile из приведенной выше ссылки).

Ребята, пожалуйста, помогите мне сохранить эту информацию на местном уровне и предложите лучший способ сделать это.

Благодаря

+0

Непонятно, в чем ваш вопрос. Что вы пытаетесь кодировать? Покажите этот код. Ни один из кода, который вы показываете, не означает «NSCoding», и что вы ожидаете реализовать? – Wain

+0

Извините. и я следил за механизмом initwithCoder и encodewithcoder .. его работая отлично для NSString и не работает для NSArray @Wain – iTag

+0

- (id) initWithCoder: (NSCoder *) aDecoder { if (self = [super init]) { name = [ aDecoder decodeObjectForKey: @ "name"]; array = [aDecoder decodeObjectForKey: @ "array"]; } return self; } - (void) encodeWithCoder: (NSCoder *) encoder { [encoder encodeObject: name forKey: @ "name"]; [encoder encodeObject: nsarray forKey: @ "nsarray"]; } но как я кодирую и декодирую другой объект класса.? @Wain – iTag

ответ

1

Так какао каркасные классы поддерживают NSCoding. Из этих классов некоторые из них являются «равными» классами (например, NSString), и они поддерживают все, что требуется. Некоторые из них являются «сложными» классами (например, NSArray), которые содержат экземпляры других классов - в этом случае все содержащиеся объекты должны поддерживать NSCoding для правильной работы кодирования.

Любой класс без рамки, который вы хотите кодировать/декодировать, необходимо указать, что он соответствует NSCoding, и вам нужно написать реализацию методов протокола (при необходимости вызовите super).

+0

, если класс содержит NSArray как свойство, как мы можем Архивировать этот @wain –

+0

@ShaikMohaideen ... он говорит, как это сделать в его ответе, вы даже его читали? –

+0

@SimonMcLoughlin мы можем делать NSCoding для типов NSString и Otherdata, но не уверены в NSArray –

1

В одном из комментариев выше, вы фактически были предложены следующие NSCoder методы (очевидно предполагая, что вы имеете дело с объектом только два свойства, name и array):

- (id)initWithCoder:(NSCoder *)aDecoder { 
    if ((self = [super init])) { 
     self.name = [aDecoder decodeObjectForKey:@"name"]; 
     self.array = [aDecoder decodeObjectForKey:@"array"]; 
    } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder { 
    [encoder encodeObject:self.name forKey:@"name"]; 
    [encoder encodeObject:self.array forKey:@"array"]; 
} 

Это в основном правильно, если суперкласс не сам по себе соответствует NSCoder. Но если super соответствует NSCoder, вы должны дать ему шанс сделать свою магию, тоже:

- (id)initWithCoder:(NSCoder *)aDecoder { 
    if ((self = [super initWithCoder:aDecoder])) { 
     self.name = [aDecoder decodeObjectForKey:@"name"]; 
     self.array = [aDecoder decodeObjectForKey:@"array"]; 
    } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder { 
    [super encodeWithCoder:encoder]; 

    [encoder encodeObject:self.name forKey:@"name"]; 
    [encoder encodeObject:self.array forKey:@"array"]; 
} 

Если вы подклассы некоторого пользовательского объекта (например,будь то GTLObject или один из ваших собственных классов), важно использовать это, также соответствует NSCoder. И вы должны повторить этот шаблон во всех ваших классах, которые будут включены в архив. Но классы Cocoa (например, NSArray) уже соответствуют NSCoder, поэтому вам нужно только беспокоиться о своих классах.