• 本地缓存


    原来的思路是把本地下载下来的数据写道sqllite数据库中,但是以后用的时间没有办法确定写在数据库中的文件在界面上应该显示的位置。被这个问题纠结了好长时间。周围ios开发人员对缓存又不太熟悉。直到来到现在的公司才有合适的人给解决了这个问题。其实思路并不是很难。

    1.首先,对下载下来的数据(json或xml)经过自己的解析,一般是存为NSArray或者NSDictionary的数据源对象。其中数据源中的每个对象(model)都要实现NSCoding协议。

    Example:我们的项目中有一个表示活动的model类。其中有getter和setter方法,代码就不贴出来了。其中有userid,activityid,messageCount,memberCount等属性。在实现NSCodeing协议后。有两个协议方法要在model类中实现。代码如下:

    #pragma mark – NSCoding

    //keyfor value的key 不贴出

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

        [aCoder encodeInt64:self.userIdforKey:1];

        [aCoder encodeInt64:self.activityidforKey:2];

        [aCoder encodeInteger:self.newmessagecountforKey:3];

        [aCoder encodeInteger:self.newmembercountforKey:4];

    }

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

        self =[superinit];

        if (self) {

            self.userId  = [aDecoder decodeInt64ForKey:1];

            self.activityid =[aDecoder decodeInt64ForKey:2];

            self.newmessagecount =[aDecoder decodeIntegerForKey:3];

            self.newmembercount =[aDecoder decodeIntegerForKey:4];

        }

        returnself;

    }

    注意:如果某个model中有NSMutableArray或NSMutableDictionary的属性,属性中如果存的不是向int,double,NSString等基本类型,也就是说,model中某个属性是其他model或者其他model的集合,则这些子model也要实现NSCoding协议。直到这个链中的属性都被基本类型位置。至于可以编码解码的函数可以去NSCoder.h中去找。

    2.这样最重要的一步已经完成,然后就可以把网络请求返回的数据源存在本地。

    //指定沙盒文件路径[FileOperDocumentFilePath:fileName].不用判断文件是否存在,同名会覆盖。

    - (void)saveMyActionData:(NSMutableArray *)fileArraywithFileName:(NSString*)fileName

    {

        if(fileArray == nil) {

            return;

        }

        NSMutableData*data = [[NSMutableDataalloc] init];

        NSKeyedArchiver*archiver = [[NSKeyedArchiveralloc]initForWritingWithMutableData:data];

        [archiverencodeObject:fileArray forKey:fileName];

        [archiverfinishEncoding];

        [data writeToFile: [FileOperDocumentFilePath:fileName]atomically:YES];

        [archiverrelease];

        [data release];

    }

    3.然后在用的时间从沙盒中把缓存文件load出来。

    - (NSMutableArray *)loadMyActionData:(NSString *)fileName

    {

        NSMutableArray *actionArray = nil;

        NSData*data = [[NSMutableDataalloc] initWithContentsOfFile: [FileOperDocumentFilePath:fileName]];

        if(data) {

            NSKeyedUnarchiver*unarchiver = [[NSKeyedUnarchiveralloc]initForReadingWithData:data];

           actionArray = [unarchiver decodeObjectForKey:fileName];

           [unarchiver release];

        }

        [data release];  

        returnactionArray;

    }

  • 相关阅读:
    (转载)VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)
    (转载)VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)
    (转载)VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)
    (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
    ubuntu下格式化u盘
    Android笔记之AppWidget
    Android笔记之ViewPager实现滑动页面
    Android笔记之获取布局中的多个子控件
    Android笔记之Actionbar制作选项卡(可滑动)
    Android笔记之Actionbar使用(二)
  • 原文地址:https://www.cnblogs.com/chendiangoal/p/5404878.html
Copyright © 2020-2023  润新知