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

编程入门 行业动态 更新时间:2024-10-27 15:21:40

iOS 网络数据接收处理和存储<a href=https://www.elefans.com/category/jswz/34/1771414.html style=方式"/>

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! NSStringlet array = jsonData["province"] as! [[String:AnyObject]]

2、kvc(自动解析)

        let objc = self.init()var count:UInt32 = 0let 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! NSStringself.province = coder.decodeObjectForKey("province") as! NSArrayreturn 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! NSDatalet 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! AppDelegatelet fetchRequest = NSFetchRequest(entityName: "Province")//删除do {let fetchRequestResult = try appDelegate.managedObjectContext.executeFetchRequest(fetchRequest) as NSArrayfor 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! Provinceprovince.name = ((model as! chinaModel).province[i] as! provinceModel).name as Stringprovince.city = ((model as! chinaModel).province[i] as! provinceModel).city as Stringdo {try appDelegate.managedObjectContext.save()}catch let error as NSError{print("could not save:",error.localizedDescription)}}//查询do {let fetchRequestResult = try appDelegate.managedObjectContext.executeFetchRequest(fetchRequest) as NSArrayfor objc in fetchRequestResult {let coreDataProvince = objc as! Provinceprint("name:",coreDataProvince.name!,"city:",coreDataProvince.city!)}}catch let error as NSError {print("could not fetch:",error.localizedDescription)}

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

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


demo GitHub地址:

更多推荐

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

本文发布于:2024-02-16 23:47:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1691855.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:方式   数据   网络   iOS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!