El almacenamiento de datos -NSKeyedArchiver (II)

En un tema ya se ha explicado cómo utilizar el NSKeyedArchiver personalizado guarda en un archivo. Pero personalmente siento que cada vez que se guarda un objeto personalizado en un archivo debe realizar los siguientes pasos:

1, tras el acuerdo NSCoding

2, los dos métodos siguientes para lograr

- ( void ) encodeWithCoder :( NSCoder *) // codificador método de archivo

- ( el anteriormente mencionado de id ) initWithCoder :( NSCoder *) // métodos de decodificación del decodificador

3, las propiedades de perfil de atributos de reconciliación archivo del código de escritura en los dos métodos anteriores.

Para empezar, los anteriores tres pasos, golpeando más de un par de veces en lo familiar, todos los golpean, entonces eso es una pérdida de tiempo, pérdida de la vida. Así que personalizó una clase, lo anterior tres pasos están encapsulados. Para utilizar NSKeyedArchiver más tarde para guardar todos los archivos en un objeto sólo necesita heredar la siguiente clase, y luego llamar a un método para completar la operación de salvar.

// 头文件
#import <Foundation/Foundation.h>

@interface PKXObject : NSObject<NSCoding>
/** 将模型对象保存到指定的路径:绝对路径 */
-(BOOL)saveToFile:(NSString *)filePath;
/** 从指定的文件路径读取模型对象 */
+(id)objectFromFilePath:(NSString *)filePath;

/** 将模型对象保存到默认的文件中(默认文件名:t_类名) */
-(BOOL)save;
/** 从默认文件(默认文件名:t_类名)中获得模型对象*/
+(id)objectWithoutFilePath;

@end
</pre><pre name="code" class="objc"><pre name="code" class="objc">//.m 文件

 
 
#import "PKXObject.h"
#import <objc/runtime.h>

#define CZFilePath [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"t_%@",[self class]]]
@implementation PKXObject

#pragma mark - 保存对象到文件/从文件中读取对象
/** 将模型对象保存到指定的路径:绝对路径 */
-(BOOL)saveToFile:(NSString *)filePath{
    if (filePath == nil || filePath.length == 0)filePath = CZFilePath;
    return [NSKeyedArchiver archiveRootObject:self toFile:filePath];
}
/** 将模型对象保存到默认的文件中(默认文件名:t_类名) */
-(BOOL)save{
    return [self saveToFile:nil];
}

/** 从指定的文件路径读取模型对象 */
+(id)objectFromFilePath:(NSString *)filePath {
    if (filePath == nil || filePath.length == 0)filePath = CZFilePath;
    return [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
}
/** 从默认文件(默认文件名:t_类名)中获得模型对象*/
+(id)objectWithoutFilePath{
    return [self objectFromFilePath:nil];
}

#pragma mark - NSCoding协议
- (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if (self) {
        Class class = [self class];
        while (class != [NSObject class]) {
            unsigned int count = 0;
            // 1.获取类成员变量列表,count为类成员变量数量
            Ivar *vars = class_copyIvarList(class, &count);
            for (int index = 0; index < count; index ++) {
                // 2.根据索引获得指定位置的成员变量
                Ivar var = vars[index];
                // 3.获得成员变量名
                const char *name = ivar_getName(var);
                // 4.成员变量名转化成oc字符串
                NSString *varName = [NSString stringWithUTF8String:name];
                // 5.成员变量类型
                const char *type = ivar_getTypeEncoding(var);
                // 5.1 成员变量类型转换成 oc 字符串
                NSString *varType = [NSString stringWithUTF8String:type];
                if ([varType isEqualToString:@"i"]) { // 整形
                    NSInteger value = [decoder decodeIntegerForKey:varName];
                    [self setValue:[NSNumber numberWithInteger:value] forKey:varName];
                } else if([varType isEqualToString:@"f"]) { // 单精度浮点型
                    CGFloat value = [decoder decodeFloatForKey:varName];
                    [self setValue:[NSNumber numberWithFloat:value] forKey:varName];
                } else if([varType isEqualToString:@"d"]) { // 双精度浮点型
                    double value = [decoder decodeDoubleForKey:varName];
                    [self setValue:[NSNumber numberWithDouble:value] forKey:varName];
                } else if([varType isEqualToString:@"c"]) { // BOOL 类型
                    BOOL value = [decoder decodeBoolForKey:varName];
                    [self setValue:[NSNumber numberWithBool:value] forKey:varName];
                } else if ([varType containsString:@"@"]) { // OC 对象
                    [self setValue:[decoder decodeObjectForKey:varName] forKey:varName];
                }
            }
            // 6.释放指针
            free(vars);
            // 7.获得父类
            class = class_getSuperclass(class);
        }
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    unsigned int count = 0;
    Class class = [self class];
    while (class != [NSObject class]) {
        // 1.获取类成员变量列表,count为类成员变量数量
        Ivar *vars = class_copyIvarList(class, &count);
        for (int index = 0; index < count; index ++) {
            // 2.根据索引获得指定位置的成员变量
            Ivar var = vars[index];
            // 3.获得成员变量名
            const char *name = ivar_getName(var);
            // 4.成员变量名转化成oc字符串
            NSString *varName = [NSString stringWithUTF8String:name];
            // 5.成员变量类型
            const char *type = ivar_getTypeEncoding(var);
            // 5.1 成员变量类型转换成 oc 字符串
            NSString *varType = [NSString stringWithUTF8String:type];
            // 6.获得成员变量的值
            id value = [self valueForKey:varName];
            if (value == nil) continue;
            if ([varType isEqualToString:@"i"]) { // 整形
                [encoder encodeInteger:[value integerValue] forKey:varName];
            } else if([varType isEqualToString:@"f"]) { // 单精度浮点型
                [encoder encodeFloat:[value floatValue] forKey:varName];
            } else if([varType isEqualToString:@"d"]) { // 双精度浮点型
                [encoder encodeDouble:[value doubleValue] forKey:varName];
            } else if([varType isEqualToString:@"c"]) { // BOOL 类型
                [encoder encodeBool:[value boolValue] forKey:varName];
            } else if ([varType containsString:@"@"]) { // OC 对象
                [encoder encodeObject:value forKey:varName];
            }
        }
        // 7.释放指针
        free(vars);
        // 8.获得父类
        class = class_getSuperclass(class);
    }
}
@end



Publicado 10 artículos originales · ganado elogios 1 · vistas 5893

Supongo que te gusta

Origin blog.csdn.net/pkxwyf/article/details/41794013
Recomendado
Clasificación