iOS Block 的理解与学习

干iOS开发3个月了,Block用到很多,但大多数还是不太理解, 自己分析感觉,Block的写法不习惯,主要还是要多写用,参考网上别人的帖子, 自己尝试谢谢 ,留作备份,方便自己以后查阅

NO.1 (简单理解Block)

ViewController.h

1)在类中,定义一个Block变量,就像定义一个函数;

(2)Block可以定义在方法内部,也可以定义在方法外部;

(3)只有调用Block时候,才会执行其{}体内的代码;

(PS:关于第(2)条,定义在方法外部的Block,其实就是文件级别的全局变量)
光看这几条 肯定看不懂咯,还是要结合例子看

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController


//定义在外部的无参数 无返回 的block
void (^notInside)() = ^(){
    NSLog(@"我是定义在外部的block");
};




- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.


    //1.定义一个无返回 参数为 int a 的名字为 printF 的 block
    void (^printF)(int a) = ^(int a){

        NSLog(@"%d",a);

        void (^nslog)(float b) = ^(float c){

            NSLog(@"%.2f",c);
        };

        nslog(2.2);

    };

    printF(9);
    printF (123);


    //2.定义了一个无返回 无参数的名字为 noback 的 block
    void (^noback)() = ^(){

        NSLog(@"no back anything");
    };

    noback();
    noback(9);


    //3.定义一个返回int  参数int 的名字为 getBack 的block
    int (^getBack)(int d) = ^(int c){
         NSLog(@"%d",c*1);
        return c*1;

    };
    getBack(100);



    //定义在外部的函数
    notInside();





}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
打印结果 

2016-02-26 15:15:01.731 iOS - Block学习[1593:66223] 9
2016-02-26 15:15:01.731 iOS - Block学习[1593:66223] 2.20
2016-02-26 15:15:01.731 iOS - Block学习[1593:66223] 123
2016-02-26 15:15:01.731 iOS - Block学习[1593:66223] 2.20
2016-02-26 15:15:01.732 iOS - Block学习[1593:66223] no back anything
2016-02-26 15:15:01.732 iOS - Block学习[1593:66223] no back anything
2016-02-26 15:15:01.732 iOS - Block学习[1593:66223] 100
2016-02-26 15:15:01.732 iOS - Block学习[1593:66223] 我是定义在外部的block

以上,是写在一个ViewController里面的block , 这样的效果相当于自己为自己写了个代理,然后自己去做这个代理(self.view.delegate = self) ,然后又在ViewController里面自己实现代理的方法( -(void)do something{…….}), 一般来说,这样的block 没什么人用,这里只是做原理解释

NO.2 (__block 是干啥的)
http://my.oschina.net/leejan97/blog/268536

 _abcd = @"22";

   __block int abcd = 22;


    int (^changeABV)(int d) = ^(int c){

        abcd = abcd*c;
        _abcd = [NSString stringWithFormat:@"%d", [_abcd intValue]*c];

        NSLog(@"%d",abcd);
        return abcd;

    };
__block (int xxx) 能让变量在block()的{}中能被修改

(周五下班 未完待续)
好了 继续回来 今天在写一个方法的时候 就用到了__block的 具体例子
这里, 我需要封装一个AFHttp请求, 为了方便,我打算返回这个请求的结果 (一个NSString)字符串,
无疑这个字符串

 NSLog(@"tn ====  %@" , operation.responseString);

是在AFNetworking中的block返回的

这里,我在外部定义一个字符串属性 t

 NSString * t =[[NSString alloc] init];

so,问题来了
这里写图片描述

这里,我们就会用到 __block 来修饰 这个定义好的字符串属性

__block NSString * t =[[NSString alloc] init];
这样,就不会报错, 让字符串属性 t 可以在被修改

这是方法全文:

-(NSString *)getTN{
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

   __block NSString * t =[[NSString alloc] init];

    [manager GET:kURL_TN_Normal parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

        NSLog(@"tn ====  %@" , operation.responseString);

         t = operation.responseString;

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    }];

    return t;

}

ps: 补充
以上代码 我也弄错了一点
这段代码

-(NSString *)getTN{.....} 这里面我打算return一个NSString,单实际上我发现在AFNetworking的Success代码块里,我获得的数据并不能拿出来 ,因为AFNetworking库里面,是异步线程做的数据获取,
唯一的解决办法就是,使用GCD 


dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //异步操作
    //返回主线程  拿到数据 dispatch(get_main_queue)
});

具体例子看这里, 重新写一个具体代码的,
http://blog.csdn.net/iostiannan/article/details/50781655
至于如何在 dispatch(get_main_queue) {} 里面return数据 ,我还没解决 ,后来的拒绝方式就是 使用代理去完成 数据的传递

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值