IOS之开发Block

   数据存储

  plist,FMDB,归档。网络数据的传输与解析,网络传输建议用JSON格式数据,冗余数据少。

 数据下载下来缓存,可直接把缓存保存成文件,便于处理缓存中的文件。根据需求来定。

block:

1.什么是block

//能极大的简化代码,提高效率。很多重要的开源库当中用block写的,不一定自己写,但是要知道怎么写。

UI开发和网络常见功能实现回调,按钮的事件处理方法是回调方法,网络下载后的回调处理

(1).按钮target action 一个方法传入按钮中

(2).表格视图 传入一个指针self,回调试图控制器中的方法

(3).block:  语句块。 解决回调,可理解为“匿名函数”,定义在方法里面

2.block的基本使用(语法)

(1).block变量

    技巧,语法诡异。

     //block变量存储匿名函数

//以下是定义block变量;函数名是block,变量类型void(^block)

    void(^block)();

     //以下定义block语句块,然后存储到block变量当中

    block =^void(){

        NSLog(@"this is block");

    };

(2).block语句块

(3)参数和返回值

(4)捕获外部变量

(5)block 注意事项

 3.block在开发中 应用(OC,UI,网络)

3.1 OC中的应用

       Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值。Block实体形式如下:^(传入参数列){行为主体};

Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。

   Block Pointer是这样定义的:

 回传值(^名字)(参数列);

 比如下面的例子:

   void(^block)();
    
    //以下定义block语句块,然后存储到block变量当中
   block =^void(){
       NSLog(@"this is block");
   };
int (^myAdd) (int x,int y)= ^int (int x,int y){
        return x+y;
    };
    int s =myAdd(12,20);
    NSLog(@"s===%d",s);

block的使用场合

函数指针

实现回调函数

qsort

block的函数类型变量+语句块===回调

 

二、AFNetworking开源库

1、AFNetworking的介绍

常见的处理网络请求方式

(1)NSURLConnection/NSURLSession

(2) ASJHttpRequest 不更新了,少用

(3)AFNetworking:推荐使用,项目中使用

(4)MKNetWorking

2、GET请求

3 JSON下载

4 DML下载

5.POST请求

6.文件上传

7.文件下载

8图片异步加载

 9 判断网络状态

10头部

11 ASJHttpRequest

//1 GET请求 (html,json,xml)
//    [self testGetRequest];
    //2POST请求
//    [self testPostRequest];
    //3  上传文件,上传图片
    
//    [self testUploadFile];
    
    //4.下载文件
//    [self testDownloadFile];
    //5.监控网络形态
    [self testMonitorNetworkStatus];
    //6.图片异步下载(可替代SDwebimage)
    //可加上 UIkit +AFNetworking.h
    
    //7. 有些请求有特殊的请求头
    //
 
}

-(void)testMonitorNetworkStatus
{
    
    AFHTTPRequestOperationManager *manager =[[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"www.baidu.com"]];
    
    [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        NSDictionary *dict =@{@(AFNetworkReachabilityStatusUnknown):@"未知",@(AFNetworkReachabilityStatusNotReachable):@"不可达",@(AFNetworkReachabilityStatusReachableViaWWAN):@"GPRS",@(AFNetworkReachabilityStatusReachableViaWiFi):@"WIFI"};
        NSLog(@"状态为  %@",dict[@(status)]);
        
    }];
    //开启状态监视
    [manager.reachabilityManager startMonitoring];

}

-(void)testDownloadFile
{
    
//创建会话管理器对象(通过默认配置)
NSString *urlString =@"http://imgcache.qq.com/club/item/avatar/zip/7/i87/all.zip";
    AFURLSessionManager *manager =[[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

    NSURLSessionDownloadTask *task =[manager downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        NSString *path =[NSString stringWithFormat:@"%@/Documents/all.zip",NSHomeDirectory()];
        NSLog(@"path  ==%@",path);
        return [NSURL fileURLWithPath:path];
        
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        NSLog(@"下载wancheng");
    }];

    [task resume];

 //返回文件保存的位置 
}

//测试上传文件
-(void)testUploadFile
{
  NSString *urlString =@"http://quiet.local/uploadtest/upload.php";
    //参数名 ;image  :参数值是图片
    AFHTTPRequestOperationManager *manager =[AFHTTPRequestOperationManager manager];
    manager.responseSerializer =[AFHTTPResponseSerializer serializer];
    
   [manager POST:urlString parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
       //上传的数据附加到请求中
       //mimetype 每种文件都有一个类型
       NSString *path =[[NSBundle mainBundle] pathForResource:@"back2.jpg" ofType:nil];
       
       
       [formData appendPartWithFileURL:[NSURL fileURLWithPath:path] name:@"image" fileName:@"jayzhang.jpg" mimeType:@"image/jpeg" error:nil
        ];
   } success:^(AFHTTPRequestOperation *operation, id responseObject) {
       NSString *str  =[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
       NSLog(@"str ===%@",str);
       
   } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
       NSLog(@"erro == %@",error);

   }];
}

-(void)testPostRequest
{
//接口,POST接口 :http://quiet.local/testdir/login.php
   
 NSString *urlString1 =@"http://quiet.local/testdir/login.php";

    AFHTTPRequestOperationManager *manager =[AFHTTPRequestOperationManager manager];
    manager.responseSerializer =[AFHTTPResponseSerializer serializer];
    
    [manager POST:urlString1 parameters:@{@"user":@"quiet",@"password":@"123"} success:^(AFHTTPRequestOperation *operation, id responseObject) {
        
                NSString *str  =[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"str ===%@",str);

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"erro == %@",error);

    }];

    

}



-(void)testGetRequest
{
  NSString *urlString =@"http://www.baidu.com";
    urlString =@"http://m.weather.com.cn/data/101010100.html";
    //定义AFNetworking管理
    
    AFHTTPRequestOperationManager *manager =[AFHTTPRequestOperationManager manager];
    
    //默认认为数据是JSON,content-type 也是JSON,responseObject 是解析的字典和数组。不是产生错误Code =-1016,解决:设置解析器为HTTP形式,下载回来是NSData.
    
    manager.responseSerializer =[AFHTTPResponseSerializer serializer];
    
    [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//        NSLog(@"a ==%@",responseObject);
        
        NSString *str  =[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"str ===%@",str);
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"erro == %@",error);
    }];

}

 

12网络基础知识

(1)一次HTTP请求的完整过程(对于IOS开发很重要)

抓包。

 (2)以打开百度网页为例,请求(get,post,delete,update). 请求包含HTTP类型(GET,POST),地址(URL),协议(HTTP、1.1),请求头部,附加信息;

 页面分为两种页面,静态的HTML页面,动态PHP,ASP,JSP页面,数据通过响应response返回给浏览器以及应用。

(3)GET请求,POST请求

都是请求的一个方式,GET一般只是为了获取数据,而POST获取的同时上传附加数据;GET请求所有参数都在URL网址中,POST请求参数放在请求头中;

 如果只是简单的获取数据,使用GET请求,登陆传密码,上传文件或图片使用POST请求。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。