您的位置:首页 > 移动开发 > IOS开发

iOS开发之归档

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

步骤:

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