iOS永続化ストレージアーカイブカスタムクラスのセット
4733 ワード
一、なぜアーカイブでデータを保存するのか
現在やっているプロジェクトでは、ユーザーがバインドした鍵、サポートしているコミュニティを永続化して保存する必要があり、鍵の数も多くなく、コミュニティの数も多くなく、plistで保存してもカスタムタイプを保存できないため、アーカイブの使用を検索して、需要を満たすことができると感じたが、ネット上の資料は基本的な使用を話しただけで、ピットに入って、配列をどのように保存するかを研究している.配列内のオブジェクトはカスタムタイプで、この方法が実行可能で、かなり軽量級であることを何度か試してみました.SQLiteかCore Dataを使えば、ちょっと役不足です.
二、どのように使うか
1.ストレージパスの取得
私の現在のプロジェクトを例にとると、プロジェクトは鍵を格納し、それぞれのログインアカウントに対応する鍵は異なるはずです.私たちはこのような状況を考慮しなければなりません.だから、ユーザーのログイン名で文字列を組み立てることができます.ここでは、鍵の格納データを取得するために、簡単な方法をパッケージしました.
+ (NSString *)keyFilePath{
NSString *paths = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
UserModel *usermodel = [UserModel sharedInstanced];
NSString *filename = [NSString stringWithFormat:@"%@key.key", usermodel.userID];
NSString *keyFilePath = [paths stringByAppendingString:filename];
return keyFilePath;
}
2.アーカイブするクラスの作成
現在のプロジェクトのキークラスには、**現在のクラスがプロトコル(instancetype)initWithCoder:(NSCoder*)aDecoderメソッドとencodeWithCoderメソッドを実装する必要があり、各プロパティに一意のキー**を定義する属性が含まれています.
#import
typedef NS_ENUM(NSInteger, PPKeyType) {
PPKeyTypeCommunityTheDoor,
PPKeyTypeUnitDoor,
PPKeyTypeElevator
};
@interface PPkeyArchiving : NSObject
@property (nonatomic, copy) NSString *name; //
@property (nonatomic, copy) NSString *key; // ,
@property (nonatomic, copy) NSString *password; //
@property (nonatomic, copy) NSString *door; //
@property (nonatomic, copy) NSString *label; //
@property (nonatomic, copy) NSString *kid; // ID
@property (nonatomic, copy) NSString *status; //
@property (nonatomic, copy) NSString *owner; //
@property (nonatomic, copy) NSString *phone; //
@property (nonatomic, copy) NSString *community; // ( )
@property (nonatomic, copy) NSString *communityID; // ID
@property (nonatomic, assign) PPKeyType keyType;
@end
//
// PPkeyArchiving.m
// PengPeng
//
// Created by on 16/8/16.
// Copyright © 2016 wangyin. All rights reserved.
//
#import "PPkeyArchiving.h"
@implementation PPkeyArchiving
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.key = [[aDecoder decodeObjectForKey:@"key"] copy];
self.name = [[aDecoder decodeObjectForKey:@"name"] copy];
self.password = [[aDecoder decodeObjectForKey:@"password"] copy];
self.kid = [[aDecoder decodeObjectForKey:@"kid"] copy];
self.status = [[aDecoder decodeObjectForKey:@"status"] copy];
self.label = [[aDecoder decodeObjectForKey:@"label"] copy];
self.owner = [[aDecoder decodeObjectForKey:@"owner"] copy];
self.phone = [[aDecoder decodeObjectForKey:@"phone"] copy];
self.community = [[aDecoder decodeObjectForKey:@"community"] copy];
self.door = [[aDecoder decodeObjectForKey:@"door"] copy];
self.communityID = [[aDecoder decodeObjectForKey:@"communityID"] copy];
}
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.key forKey:@"key"];
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.password forKey:@"password"];
[aCoder encodeObject:self.kid forKey:@"kid"];
[aCoder encodeObject:self.status forKey:@"status"];
[aCoder encodeObject:self.label forKey:@"label"];
[aCoder encodeObject:self.owner forKey:@"owner"];
[aCoder encodeObject:self.phone forKey:@"phone"];
[aCoder encodeObject:self.community forKey:@"community"];
[aCoder encodeObject:self.door forKey:@"door"];
[aCoder encodeObject:self.communityID forKey:@"communityID"];
}
3.データの保存、読み取りプロセス
// 。 , 1 , 。
+ (void)saveKeysWithNSArray:(NSArray *)array{
NSMutableArray *keyList = [[NSMutableArray alloc] init];
[NSKeyedArchiver archiveRootObject:keyList toFile:[[self class] keyFilePath]];
}
//
+ (NSArray *)readKeysList{
NSMutableArray *keyList = [[NSKeyedUnarchiver unarchiveObjectWithFile:[[self class] keyFilePath]] mutableCopy];
if (!keyList) {
keyList = [[NSMutableArray alloc] init];
}
return keyList;
}
OK,ここまで,以上のコードにより,一つの配列にNSCodingプロトコルを遵守し,そのプロトコルにおける2つのメソッドのクラス保存と読み取りを実現することができる.
注意事項
1.NSCodingプロトコルを遵守し、このプロトコルの2つの方法を実装する.
2.接尾辞名はカスタマイズできます.この文書で示すコードパスは、必要に応じて自分で変更できます.
コメントエリアのネットユーザーのヒントによると、runtimeを通じて自動的にアーカイブしてファイルを解くことができて、実践して、demo githubアドレスを添付します