iOS 网络数据接收处理和存储方式

从网络拿到数据后需要解析处理,处理步骤主要分为两步:

JSON ---> NSDictionary

NSDictionary ---> model


第一步:

JSON ---> NSDictionary

NSJSONSerialization (iOS 5.0+)

let jsonString = "{\"name\": \"中国\",\"province\": [{\"name\": \"黑龙江\",\"city\": \"哈尔滨\"}, {\"name\": \"广东\",\"city\": \"广州\"}, {\"name\": \"台湾\",\"city\": \"台北\"}, {\"name\": \"新疆\",\"city\": \"乌鲁木齐\"}]}"
let jsonData = try! NSJSONSerialization.JSONObjectWithData(jsonString.dataUsingEncoding(NSUTF8StringEncoding)!,options: NSJSONReadingOptions.MutableContainers) as! NSDictionary


第二步:

NSDictionary ---> model

1、objectForKey(手动解析)

        let name = jsonData["name"] as! NSString
        
        let array = jsonData["province"] as! [[String:AnyObject]]

2、kvc(自动解析)

        let objc = self.init()
        
        var count:UInt32 = 0
        
        let properties = class_copyPropertyList(self.classForCoder(),&count)
        
        for var i = 0; i < Int(count); ++i {
            
            let propert : objc_property_t  = properties[i]
            
            let keys : NSString = NSString(CString: property_getName(propert), encoding: NSUTF8StringEncoding)!
            
            objc.setValue(jsonData[keys],forKey: keys as String)
        }


class_copyPropertyList:拿到一个类的所有属性,并把个数输出到count

property_getName:拿到一个属性的名称(用来获取字典里对应的value)

然后将此类赋值 (复杂类型需要使用 property_getAttributes 、NSClassFromString 来初始化后,再赋值给此类

推荐第三方库:MJExtention


解析完成后,如果需要,则对数据进行本地化存储,存储形式分类如下:

1、NSUserDefault

支持类型:NSString,NSNumber,NSDate,NSArray,NSDictionary,NSData(注意:不支持可变类型,如NSMutableArray)

扩展类型:自定义类需要实现 <NSCoding> 协议中的 initWithCoder和encodeWithCoder方法,然后转换成NSData 存入NSUserDefault

    func initWithCoder(coder:NSCoder) -> AnyObject {
        
        self.name = coder.decodeObjectForKey("name") as! NSString
        self.province = coder.decodeObjectForKey("province") as! NSArray
        return self
        
    }
    
    func encodeWithCoder(coder:NSCoder) {
        coder.encodeObject(name, forKey: "name")
        coder.encodeObject(province, forKey: "province")
    }

存与取:


            let modelData = NSKeyedArchiver.archivedDataWithRootObject(model)
            
            NSUserDefaults.standardUserDefaults().setObject(modelData, forKey: "modelKVC")
            
            let modelDataStore = NSUserDefaults.standardUserDefaults().objectForKey("modelKVC") as! NSData
            
            let modelStore = NSKeyedUnarchiver.unarchiveObjectWithData(modelDataStore) as! chinaModel

注意:如果没有调用 synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。如果调用,则立刻保存到文件中。此文件位于沙盒下的Library/Preference 下的一个与工程同名的plist文件中。


2、文件存储(plist为例)

支持类型:NSString,NSMutableString、NSNumber,NSDate,NSArray,NSMutableArray、NSDictionary、NSMutableDictionary、NSData、NSMutableData

存与取:


            let path:NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first!
            
            let fileName = path.stringByAppendingPathComponent("modelStore.plist")
            
            let modelData = NSKeyedArchiver.archivedDataWithRootObject(model)
            
            modelData.writeToFile(fileName, atomically: true)
            
            let modelDataStore = NSData(contentsOfFile: fileName)
            
            let modelStore = NSKeyedUnarchiver.unarchiveObjectWithData(modelDataStore!) as! chinaModel

注意:自定义文件存储在沙盒中,具体路径区别如下:

DocumentDirectory:Documents目录,iTunes会同步此文件夹中的内容,适合存储重要数据

CachesDirectory:Library/Caches目录,iTunes不会同步此文件夹,适合存储体积大不需要备份的数据

PreferencePanesDirectory:Library/Preference目录,iTunes会同步此文件夹中的内容,通常存储应用设置的信息(用于NSUserDefaults 存储)

NSTemporaryDirectory:tmp目录,iTunes不会同步此文件夹中的内容,系统会不定期(应用后台运行或者手机存储空间吃紧的情况下)清理该文件夹下的内容,适合存储临时文件

3、数据库存储(coreData为例)

支持类型:integer16、32、64,decimal,double,float,string,boolean,date,binary data

存与取:

            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            let fetchRequest = NSFetchRequest(entityName: "Province")
            
            
            //删除
            do {
                let fetchRequestResult = try appDelegate.managedObjectContext.executeFetchRequest(fetchRequest) as NSArray
                for objc in fetchRequestResult {
                    appDelegate.managedObjectContext.deleteObject(objc as! NSManagedObject)
                }
            }
            catch let error as NSError {
                print("could not fetch:",error.localizedDescription)
            }
            
            
            //插入
            for var i = 0; i < (model as! chinaModel).province.count;++i{
                let province =  NSEntityDescription.insertNewObjectForEntityForName("Province", inManagedObjectContext:appDelegate.managedObjectContext) as! Province
                province.name = ((model as! chinaModel).province[i] as! provinceModel).name as String
                province.city = ((model as! chinaModel).province[i] as! provinceModel).city as String
                
                do {
                    try appDelegate.managedObjectContext.save()
                }
                catch let error as NSError{
                    print("could not save:",error.localizedDescription)
                }
            }
            
            
            //查询
            do {
                let fetchRequestResult = try appDelegate.managedObjectContext.executeFetchRequest(fetchRequest) as NSArray
                for objc in fetchRequestResult {
                    
                    let coreDataProvince = objc as! Province
                    
                    print("name:",coreDataProvince.name!,"city:",coreDataProvince.city!)
                }
            }
            catch let error as NSError {
                print("could not fetch:",error.localizedDescription)
            }

注意:coredata不是线程安全的。一般情况下,一个managedObjectContext负责更新UI,一个负责在后台进行费时操作

sqlite参考文章:点击打开链接


demo GitHub地址:https://github.com/piang/iOSAnalyseStoreJsonData

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值