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

来源:互联网 发布:淘宝企业店铺的费用 编辑:程序博客网 时间:2024/06/01 23:44

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

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 0
原创粉丝点击