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

Block学习一:基本用法,用block封装NSURLRequest异步请求

时间: 2024-10-09 20:35:08

Block学习一:基本用法,用block封装NSURLRequest异步请求的相关文章

尝试封装一个异步请求then方法和catch方法

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

block传值以及利用block封装一个网络请求类

1.block在俩个UIViewController间传值 最近刚学了几招block 的高级用法,其实就是利用block语法在俩个UIViewController之间传值,在这里分享给初学者,同时也方便我自己理解.我们知道UINavigationController类管理UIViewController的时候,利用的是"栈"的思想,在这里不做过多解释,切入正题,假设我们现在有俩个UIViewController,viewC1和viewC2,viewC1比viewC2先进入到UINavi

Block变量的的用法,使你的程序看起来清晰明了!

<span style="font-size:24px;">为什么要使用block变量呢? 因为当我们的程序比较繁杂的时候,我们在一个函数中要调用一个函数,还需要在外边来定义,实现,很不方便,但是有了block变量我们就可以在一个函数的内部来定义一个block变量,相当于又在函数的内部来定义了一个函数. int (^max)(int x,int y) = ^(int x,int y)//求两个数的最大值 { return x > y ? x :y; }; NSLog(

dispaly 的block与inline-block的用法

一直以来没有弄清block与line-block的用法,今天花点时间整理一下. <body> <div class="div1">div1</div> <div class="div2">div2</div> <span class="span1">span1</span> <span class="span2">span2<

IOS 中block结构的简单用法

自从block出现之后,很多API都开始采用这样的结构,由此可见,block确实有许多优势存在,这里将一些简单用法总结如下: 一.如何声明一个block变量 我们通过^符号来声明block类型,形式如下: void (^myBlock)(); 其中第一个void是返回值,可以是任意类型,中间括号中^后面的是这个block变量的名字,我把它命名为myBlock,最后一个括号中是参数,如果多参数,可以写成如下样式: int (^myBlock)(int,int); 同样,你也可以给参数起名字: in

(Object-C)学习笔记(五) --OC的Block

OC的Block 文大大的Block见解 http://www.cnblogs.com/wendingding/p/3709604.html Block跟方法差不多,随写随用,而且做完运算后能即时返回一个返回值,非常方便,大大提高了编程效率.但是不建议多用,因为Block会导致代码的易读性大大降低.

Java EE学习--Quartz基本用法

新浪博客完全不适合写技术类文章.本来是想找一个技术性的博客发发自己最近学的东西,发现博客园起源于咱江苏,一个非常质朴的网站,行,咱要养成好习惯,以后没事多总结总结经验吧.很多时候都在网上搜索别人的总结,我自己也总结些东西,或许多多少少能帮得上别人. 首先提到的是Quartz,一个开源的定期执行计划任务的框架.其实我内心好奇这个框架很久了,像那些能定时修改数据库数据,定时分配任务的功能一直觉得很神奇.心动不如行动,今天我就小小的学习了一下用法,力求言简意赅,大家都懂的我就不说了. 第一步:下载Qu

使用系统的某些block api(如UIView的block版本写动画时),是否也考虑循环引用问题?

系统的某些block api中,UIView的block版本写动画时不需要考虑,但也有一些api 需要考虑 以下这些使用方式不会引起循环引用的问题 [UIView animateWithDuration:duration animations:^ { [self.superview layoutIfNeeded]; }]; [[NSOperationQueue mainQueue] addOperationWithBlock:^ { self.someProperty = xyz; }]; [[

display:block、display:inline与displayinline:block的概念和区别

总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通常被现实为独立的一块,会单独换一行:inline元素则前后不会产生换行,一系列inline元素都在一行内显示,直到该行排满. 大体来说HTML元素各有其自身的布局级别(block元素还是inline元素): 常见的块级元素有 DIV, FORM, TABLE, P, PRE, H1~H6, DL,