IOS持久化和网络请求

文件的读写:
1.应用程序的沙盒(sandbox)
打开:桌面-前往-ALT-资源库-Application Support-iPhone Simulator --
Applications-…….-Documents-Library-tmp-

         •Bundle是一个目录,其中包含了程序会使用到的资源,这些资源包含了如图像、声音、编译好的代码、nib文件等。
        •Cocoa提供了类NSBundle来访问应用程序中用到的资源。

    //bundle是沙盒下的应用程序,是只读的,获取plist文件路径     

    NSString *path = [[NSBundle mainBundle]pathForResource:@“---" ofType:@“---”];

     Documents目录:应用程序将其数据存储在Documents目录中,可读写
     获取Documents目录:
     eg:  NSArray *array = NSSearchPathForDirectoriesInDomains ( NSDocumentDirectory , NSUserDomainMask , YES ); // 查找 Documents( NSLibraryDirectory 目录,搜索限制在应用程序沙盒内, YES 将搜索后的路径中~符号展开为实际路径

         NSString *documentsDiretoryPath = [paths objectAtIndex:0];


获取Library目录:
eg:同上
获取tmp目录:
eg: NSString *tmpDirectoryPath = NSTemporaryDirectory ();

2.使用NSString进行文件读写
读:
eg:  NSString *filePath = [documentsPath stringByAppendingPathComponent : @"content.txt" ];

    NSError *error = nil;   

    NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];//一文件路径,二读取文件时用的编码,三错误对象的地址    

       if (error != nil) {      

         NSLog(@"出错的,信息为:%@",error);  

      }else{

         self.textView.text = content;  

    }

写:
eg: NSString *content = self . textView . text ;

    NSError *error = nil;    

     [content writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];//YES保存文件会生成临时文件

    if (error != nil) {   

        NSLog(@"出错的,信息为:%@",error); 

      }else{    

         NSLog(@"保存成功"); 

    }


3.使用NSData进行文件读写,更多用来读写二进制
读:
eg:NSData *data = [NSData dataWithContentsOfFile:filePath];
写:
eg: NSData *data = nil;//定义接受的文件
    [data writeToFile:@“文件保存” atomically:YES];

4.NSFileManager的使用 :管理文件及目录的类,可以判断文件是否存在,创建,删除文件,
eg:NSFileManager *fileManager = [NSFileManager defaultManager]; //创建
   BOOL isExits = [fileManager fileExitsAtPath:@“文件路径”]; //判断文件是否存在
   [fileManager createFileAtPath:@“文件路径” contents:nil attributes:nil]; //创建一个指定内容及属性的文件在给定路径处
   [fileManager moveItemAtPath:@“源文件” toPath:@“目标路径” error:nil]; / /移动一个文件到目标位置

5.NSFileHandle的使用
使用步骤: 1. 打开文件 
         2.通过NSFileHandle进行输入/输出操作  
         3.关闭文件 -(void)closeFile
获取NSFileHandle对象:
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:@“文件路径”];//创建只读         (fileHandleForUpdatingAtPath)          //创建读写  (fileHandleForWritingAtPath)           //创建只写

NSData* data = [handle readDataOfLength:1000];
 // 读取指定长度字节的数据
NSData* data = [handle readDataToEndOfFile];
// 读取直到文件结尾的数据
[handle seekToEndOfFile];   // 将句柄移动到文件结尾
[handle seekToFileOffset:1000];  // 将句柄移动到指定字节处
[handle writeData:[[NSData alloc]init]];     // 在当前句柄处写入数据
NSData* data = [handle availableData];   // 取得当前句柄上所有可用的数据
[handle closeFile];   // 关闭句柄指向的文件poo0+

属性列表:项目名-info.plist的文件
属性列表序列化:是指将对象转换为字节流,以便存储或传输

对像归档: 使用归档必须实现NSCoding协议 < NSCoding >
NSCoding协议声明的两个方法:
      一个方法将对象编码到归档中,
      一个方法将归档进行解码创建一个对象。
eg:

//aCoder编码器

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

    [eCoder encodeInt:self.age forKey:@"age"];    

    [eCoder encodeObject:self.name forKey:@"name"];

}
//dDecoder 解码器

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

     if (self = [super init]) {     

         self.age = [dDecoder decodeIntForKey:@"age"];      

         self.name = [dDecoder decodeObjectForKey:@"name"];  

       }   

     return self;

   }

    //定义归档器    

      NSKeyedArchiver *key = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];     //obj归档,forkey用来指定后面解码用的    

    [key encodeObject:obj forKey:@"stu"];    

        //关闭归档器

    [key finishEncoding];

    //定义解码器    

         NSKeyedUnarchiver *key = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];   

    //通过解码器,获取解码器中的内容   

    Student *st = [key decodeObjectForKey:@"stu"];   

    [key finishDecoding];



网络请求:
网络请求简介及状态检查:
a Xcode-Organizer-Documentation
b 在搜索栏输入:Reachability-选择Sample Code - Reachbility
c 打开Open Project

typedef enum {  

    NotReachable = 0, //网络连接不可用   

    ReachableViaWiFi, //通过wifi连接   

     ReachableViaWWAN //通过2G/3G网络连接

} NetworkStatus;


NSString获得远程文本文件
NSURL *url = [NSURL URLWithString:@“远程地址”];
NSString *content = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSDate获得远程二进制文件
NSURL *url = [NSURL URLWithString:@“远程地址”];
NSData *data = [NSData dataWithContentsOfURL:url];

网络连接方式:
同步:  
   步骤:创建NSURL, NSURL *url = [ NSURL URLWithString :@“”];

        通过NSURL创建NSURLRequest,

            //创建网络请求

             NSURLRequest *req = [ NSURLRequest requestWithURL :url];
        建立NSURLConnection发送同步请求,
  /*
   * 请求对象
   * 响应者
   * 错误的对象
  */
    [NSURLConnection sendSynchronousRequest:<#(NSURLRequest *)#> returningResponse:<#(NSURLResponse **)#> error:<#(NSError **)#>];
        数据完成之后进行处理

异步:
   步骤:创建NSURL,通过NSURL创建NSURLRequest,建立NSURLConnection发送异步请求,    
    // 异步连接
  /*
   *  请求对像
   *  该异步请求所在线程执行的操作队列
   *  异步请求完后执行的代码块
  */

    [NSURLConnection sendAsynchronousRequest:req queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

{    //响应对象,接收到的数据,错误对象      

     dispatch_async(dispatch_get_main_queue(), ^{          

     self.img.image = [UIImage imageWithData:data];       

    });      

    }];

 


NSURLConnection 异步代理:
遵守协议 < NSURLConnectionDataDelegate >
//获取服务器后调用一次

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{    //获取下载期望的整值  

      self.lenght = [response expectedContentLength];

}

//data参数就是每次获取的数据块

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

    [self.final appendData:data];  

    self.myProgress.progress = self.final.length/self.lenght;   

    self.myLabel.text = [NSString stringWithFormat:@"%.1f%%",self.myProgress.progress*100];   

    self.img.image = [UIImage imageWithData:self.final];

}


HTTP网络请求 :默认GET方式
  GET是用来从服务器上获得数据(URL之后?各变量之间&),POST是用来上传数据
              GET 操作简单,所有参数直接写到地址中
              POST 操作复杂,将参数和地址分开来写
              GET 请求安全性不如 POST 形式
              GET 请求 URL 地址长度有限, POST 请求可以传递大量数据
         eg:POST的设置
         // 创建可变的网络请求对象

    NSMutableURLRequest *req = [[NSMutableURLRequest alloc]initWithURL:url];   

    [req setHTTPMethod:@"post"];   

     NSString *avgs = [NSString stringWithFormat:@"name=艺煌&pass=23"];  

     NSData *data = [avgs dataUsingEncoding:NSUTF8StringEncoding];    

     [req setHTTPBody:data];


JSON简介:构造--字典{}和数组[]
eg: [{
  "name" : " 张三 " "age" : 18 ,
  “bool”:true,   "head" : " http://192.168.13.8/1.png "  }]
注意: “健”:“对象”
JSON的解析
          •常见的第三方类库有
             SBJson:一个广泛被使用的基于类目的第三方类库,为NSString添加了方法,将字符串变为字典或数组形式
             TouchJson:传入JSON的二进制数据然后对其进行解析
            JSONKit:跟上面的TouchJson解析方式一致
        eg:导入JSON类
       NSDictionary * dict = [ NSJSONSerialization JSONObjectWithData :data options : kNilOptions error : nil ];
      

         XML语言规范:XML声明,标记区分大小写,<>,      
        XML解析:
          •解析 XML 通常有两种方式:DOM 和 SAX
            – DOM 解析 XML 时,读入整个 XML 文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意 XML 节点,读取它的属性和值
            – SAX 解析 XML ,是基于事件通知的模式,一边读取 XML 文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理
              •iOS中自带XML解析类库为NSXMLParse是基于SAX的方式
          eg:   // 定义一个解析器

    NSXMLParser * parser = [[NSXMLParser alloc]initWithData:data];   

    parser.delegate = self;  

     [parser parse];//开始解析


          •常见的第三方类库有:GDataXML类库。
           步骤: 导入GDataXMLNode.h和GDataCMLNode.m包,添加libxml2.dylib库。
           eg:
                // 获取文档对象

    GDataXMLDocument * doc = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];   

       //获取根节点对象   

    GDataXMLElement * root = [doc rootElement];   

        //获取User节点  

     GDataXMLElement * user = [[root elementsForName:@"User"] objectAtIndex:0];  

         //取得User文本内容   

     NSString * userId = [[user attributeForName:@"id"]stringValue];


JSON和XML的区别:
可读性  JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
·可扩展性  XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
·编码难度  XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
·解码难度  XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
·流行度  XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了
          
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值