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") }
存与取:2、文件存储(plist为例)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文件中。
支持类型: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
- iOS 网络数据接收处理和存储方式
- IOS数据存储方式
- iOS数据存储方式
- iOS数据存储方式
- ios 数据存储方式
- android 数据存储和访问方式五:网络详解
- ios数据存储方式FMDB
- iOS数据存储方式总结
- ios数据存储方式FMDB
- ios数据存储方式FMDB
- iOS - 数据存储方式FMDB
- iOS中数据存储方式
- ios中的数据存储方式
- iOS-数据存储方式介绍
- iOS数据存储方式总结
- ios 数据存储常用方式
- ios 沙盒和常见的数据存储方式。
- ios应用数据存储方式(plist存储)
- PHP学习笔记
- 支付流程
- ViewPager+Fragment以及GridView的使用
- above average(0706)
- Android中AsyncTask的简单入手方式
- iOS 网络数据接收处理和存储方式
- PHP中empty()和isset()的区别
- android中Rect类的使用
- Opencv学习笔记(一)滤波器原理及其使用
- JNI函数的动态注册
- swustoj---寝室扫地问题509
- 过去一年 硅谷科技圈发生了这五大变化
- 《Spring实战》学习笔记-第一章:Spring之旅
- oracel字符截取substr