2016-07-27 14 views
-1

私はbluetoothを使用して2つのデバイス間でデータを転送しようとしています。カスタムNSObjectをNSDataに変換したいカスタムNSObjectをNSDataに変換する

受信したNSDataをカスタムNSObjectにデコードする最適な方法は何ですか?

ありがとうございます!

+0

て行くために

NSData *data = [currentDefaults objectForKey:@"DATA"]; className = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

を取得: 'カスタムをinit)など – Larme

答えて

3

NSCodingを使用する必要があります。 NSCodingは、単純なプロトコルで、2つの方法、initWithCoder:およびencodeWithCoder:があります。 NSCodingに準拠するクラスは、ディスクにアーカイブすることも、ネットワークに分散させることもできるデータにシリアル化およびデシリアライズすることができます。

NSCoding/NSKeyed​Archiver. NSCodingのチュートリアルです。

アーカイブ

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:YourClass];

アーカイブ解除

YourClass *objYourClass = [NSKeyedUnarchiver unarchiveObjectWithData:data];

また、私のanswerを参照することができます。まず、Beanクラスを作成し、NSDataをBeanクラスオブジェクトから、そしてUnarchive BeanクラスオブジェクトをNSDataからArchiveできるようにしてから、initWithCoder:encodeWithCoder:を実装する必要があります。

0

私の非常に単純な答え

まず、我々はNSObject.mでencodeWithCoderとinitWithCoderを実装する必要があり、私はNSObjectのClass.For例では2つのデータ(ユーザー名とパスワード)を持って、その前に、私はthis.Youが理解できる設定

- (void)encodeWithCoder:(NSCoder *)encoder 
{ 
    //Encode properties, other class variables, etc 
    [encoder encodeObject:@"Dev" forKey:@"username"]; 
    [encoder encodeObject:@"[email protected]" forKey:@"password"]; 
} 

- (id)initWithCoder:(NSCoder *)decoder 
{ 
    if((self = [super init])) 
    { 
    //decode properties, other class vars 
    userName = [decoder decodeObjectForKey:@"username"]; 
    passWord = [decoder decodeObjectForKey:@"password"]; 
    } 
    return self; 
} 

次にViewController.mで

NSObjectClass *className = [[NSObjectClass alloc]init]; 
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:className]; 
[currentDefaults setObject:data forKey:@"DATA"]; 
[currentDefaults synchronize]; 
保存

のために

ために、さらに詳細にはあなたのクラスNSCodingに準拠させるとJSONに `NSKeyedArchiver`、または翻訳を使用して(と` initWithJSONを作成することができます私のANSWER

関連する問題