zoukankan      html  css  js  c++  java
  • Block学习一门:基本使用,使用block包NSURLRequest异步请求

    首先,看一下下面的代码:

    void (^myFirstBlock)(int theOne,int theTwo) = ^(int theOne,int theTwo){
            NSLog(@"====%d",theOne+theTwo);
        };
        myFirstBlock(100,300);

    void:指的时返回数据类型,myFirstBlock:指的是block的名称,后面两个是參数。

    等号右边的block的实现。

    个人理解:block本身就是一个类。他的实例化就是一个对象。以下看看这个数据请求的封装,来好好理解这句话。

    我把数据请求这一款,封装在了:WebService这个类中,先看h文件:

    <span style="font-size:14px;">//
    //  WebService.h
    //  BlockDemo
    //
    //  Created by junyuan ji on 14-6-3.
    //  Copyright (c) 2014年 junyuan ji. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    
    typedef void (^successBlock)(NSMutableURLRequest * request,NSMutableData * reciveData);
    typedef  void (^errorBlock)(NSMutableURLRequest * request);
    typedef void (^startBlock)(NSMutableURLRequest * request);
    typedef void (^complectionBlock)(NSMutableURLRequest * request,NSMutableData * reciveData);
    
    
    @interface WebService : NSObject<NSURLConnectionDataDelegate,NSURLConnectionDelegate>
    {
       __block NSHTTPURLResponse * httpResponse;
    }
    @property (nonatomic,copy) successBlock successblock;
    @property (nonatomic,copy) errorBlock errorblock;
    @property (nonatomic,copy) startBlock startblock;
    @property (nonatomic,copy) complectionBlock complectionblock;
    @property (nonatomic,retain) __block NSMutableData * reciveMutableData;
    
    -(void)StartUrl:(NSString *)path;
    
    -(void)Url:(NSString *)path onSuccess:(successBlock)successBlock onError:(errorBlock)errorBlock onStart:(startBlock)startBlock onCompletion:(complectionBlock)complectionBlock;
    @end</span><span style="font-size:18px;">
    </span>

    上面typedef是声明block,以下把block声明称属性。比方successblock是一个对象,自然能够把它声明成属性。

    以下看看m文件的代码:

    //
    //  WebService.m
    //  BlockDemo
    //
    //  Created by junyuan ji on 14-6-3.
    //  Copyright (c) 2014年 junyuan ji. All rights reserved.
    //
    
    #import "WebService.h"
    
    @implementation WebService
    
    -(void)Url:(NSString *)path onSuccess:(successBlock)successBlock onError:(errorBlock)errorBlock onStart:(startBlock)startBlock onCompletion:(complectionBlock)complectionBlock
    {
        [self StartUrl:path];
        self.successblock = ^(NSMutableURLRequest * request,NSMutableData * reciveData){
            if (httpResponse.statusCode == 200)
            {
               successBlock(request,reciveData);
            }
        };
        self.startblock = ^(NSMutableURLRequest *request){
            startBlock(request);
        };
        self.errorblock = ^(NSMutableURLRequest * request){
            errorBlock(request);
        };
        self.complectionblock = ^(NSMutableURLRequest * request,NSMutableData * reciveData){
            complectionBlock(request,reciveData);
        };
    }
    -(void)StartUrl:(NSString *)path
    {
        NSURL * url = [NSURL URLWithString:path];
        NSMutableURLRequest * request1 = [NSMutableURLRequest requestWithURL:url];
        [NSURLConnection connectionWithRequest:request1 delegate:self];
    }
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
         NSLog(@"%s",__FUNCTION__);
        self.errorblock((NSMutableURLRequest *)connection.currentRequest);
    }
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
        NSLog(@"%s",__FUNCTION__);
        httpResponse = (NSHTTPURLResponse *)response;
        self.reciveMutableData = [NSMutableData dataWithCapacity:0];
        self.startblock((NSMutableURLRequest *)connection.currentRequest);
    }
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
         NSLog(@"%s",__FUNCTION__);
        [self.reciveMutableData appendData:data];
    }
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
         NSLog(@"%s",__FUNCTION__);
        self.complectionblock((NSMutableURLRequest *)connection.currentRequest,self.reciveMutableData);
    }
    @end
    

    上面这几段代码,应该好好去理解,假设上面这段代码看懂了,block基本上也就掌握了。

    以下看看怎样使用封装的这个类:


    #import "AppDelegate.h"
    #import "WebService.h"
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
    
        
        void (^myFirstBlock)(int theOne,int theTwo) = ^(int theOne,int theTwo){
            NSLog(@"====%d",theOne+theTwo);
        };
        myFirstBlock(100,300);
        
        
        [[[WebService alloc] init] Url:@"http://zhangmenshiting.baidu.com/data2/music/65532488/1490719597200128.mp3?xcode=f1ea4f162f276d435fc963a294370657c9d1e761819ce1d5" onSuccess:^(NSMutableURLRequest *request, NSMutableData *reciveData) {
            NSLog(@"reciveData = %@",reciveData);
        } onError:^(NSMutableURLRequest *request) {
            NSLog(@"error = ");
        } onStart:^(NSMutableURLRequest *request) {
            NSLog(@"start");
        } onCompletion:^(NSMutableURLRequest *request, NSMutableData *reciveData) {
            NSLog(@"completion");
        }];
        
        return YES;
    }
    





  • 相关阅读:
    [BZOJ2071] [POI2004]JAS
    [BZOJ1852] [MexicoOI06]最长不下降序列(dp+贪心转移)
    用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)(转)
    Amazon云计算的一些实用应用(转)
    使用netbeans6.7.1开发webservice 服务端 和 客户端(转)
    深入探索SOAP1.1使用SAAJ1.2.1(转)
    推荐:PoolParty!一个管理EC2集群的Ruby Gem开源工具(转)
    max 加载 菜单项
    2011 新相
    重要的视图类型解释。
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5031883.html
Copyright © 2011-2022 走看看