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;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值