iOS开发之归档

在完成某项需求时,我们需要对网络数据进行存储,比如进行广告展示,或者一些其他数据,对于第一次加载影响客户端的友好程度上,我们采用先请求存储后进行二次展示

步骤:

1.归档,首先将请求到的数据进行归档可以使用如下

NSData *model =  [NSKeyedArchiver archivedDataWithRootObject:modelHttp];这里的modelHttp就是我们请求到并且解析出的网络数据

2.使用usedefault简单的本地存储

[USER_DEFAULTS setValue:model forKey:saveModel];

3.二次使用的时候进行从usedefault取出数据

NSData *data = [USER_DEFAULTS valueForKey:savedModel];

4.解归档

Model *modelHttp = [NSKeyedUnarchiver unarchiveObjectWithData:data];

然后就可以使用

注意:在进行归档时应该注意编码和解码,对于属性较少的情况下我们可以使用encoder和decoder即在模型类中

- (id)initWithCoder:(NSCoder *)decoder {

    

    self = [super init];

    if (!self) {

        return nil;

    }

    self.adIds = [decoder decodeObjectForKey:@"adIds"];

   

}


- (void)encodeWithCoder:(NSCoder *)encoder {

    [encoder encodeObject:self.adIds forKey:@"adIds"];

   

}

但是当我们遇到的属性非常多的时候这样就不行了。使用runtime机制

- (id)initWithCoder:(NSCoder *)aDecoder {

    

  

    if (self = [super init]) {

        unsigned int outCount;

        Ivar * ivars = class_copyIvarList([self class], &outCount);

        for (int i = 0; i < outCount; i ++) {

            Ivar ivar = ivars[i];

            NSString * key = [NSString stringWithUTF8String:ivar_getName(ivar)];

            [self setValue:[aDecoder decodeObjectForKey:key] forKey:key];

        }

    }

    return self;

}


- (void)encodeWithCoder:(NSCoder *)aCoder {

    unsigned int outCount;

    Ivar * ivars = class_copyIvarList([self class], &outCount);

    for (int i = 0; i < outCount; i ++) {

        Ivar ivar = ivars[i];

        NSString * key = [NSString stringWithUTF8String:ivar_getName(ivar)];

        [aCoder encodeObject:[self valueForKey:key] forKey:key];

    }

}

你可能感兴趣的:(ios)