关于block的理解

FBI WARNING:纯属个人见解,有可能是错误的理解。O(∩_∩)O
block作用
1.可以传递数据,取代代理模式很方法,代码简洁。
2.当做回调,这是主要的用途。
写法也简单,固定格式,照着写就行,一般不会出错,记得防止出现循环引用就行。别的没啥。

问题:block它是怎么传递数据的,回调怎么工作的。我冥思苦想一番,感觉有点眉目了,记录一下,怕忘了。

一、函数。(或者叫<方法>,叫法不一样,感觉没啥区别)
1.1正常情况下,定义一个函数包括名字,参数,返回值3部分。
1.2使用起来包括定义、实现、调用3步。
例如:
定义+实现。大括号里就是一个函数的实现部分,前面定义了名字和参数返回值

- (void)testFunction1WithParameter:(NSString *)title{
   
    NSLog(@"方法1的实现 -- %@", title);
}

调用:

[self testFunction1WithParameter:@"方法1"];

这就是函数的使用。

二、block
block是特殊函数!!!
这点很重要。时时刻刻记得这一点。重点:block是函数。
再强调一下,block就是特殊函数,本质还是函数,既然是函数,函数怎么用,block也怎么用,和上面函数是一样。
苹果用^这个符号标记block,告诉人们看到这个符号,就是个block了。没别的意思,给这个函数加了个标记,写法不一样了。
1.block也有方法名,参数,返回值。和普通函数一样。
定义一个block:和普通函数一样,都是定义+实现

    void(^block)() = ^(){
        NSLog(@"block的实现");
    };

这就定义了一个无参数无返回值,叫block名字的的函数,用^标记一下,大括号依然是函数的实现部分。

 block();

执行函数,由于block是特殊的函数,执行方式和普通函数也不一样,不用self调用,直接写函数名字跟个小括号就行了。比较不像oc。
总结:block是特殊函数,特殊的地方就在于定义和调用方式和普通函数不一样,实现部分没变化,还是在大括号里面实现。

另外:如果定义一个字符串,NSstring *a = @"字符串";
NSstring 是类型,a是名字。
函数有没有类型?当然有!
block这种函数的写法,相当于用这个特殊符号标记了一个函数的类型。void(block)() 这段代码就是block的定义。有名字、参数类型、返回值类型。
所以,block的写法可以定义一个函数的类型。这个函数的类型就是void(^)(),名字就是block。

2.经过上面的洗脑,慢慢接受了block是函数的观点,和普通函数没啥区别。就是样子怪怪的罢了。
如果block像上面这么定义+实现+调用,用法其实和普通函数没啥区别,就体现不出它的价值了。

注:如果block不作为参数,需要在^符号后面直接写上block名字,然后直接调用,如第1的例子。
如果作为参数需要像普通的参数那样写,在最后写上block名字,如下。

//block传递数据
- (void)testFunction2WithParameter:(NSString *)title testBlock:(void(^)(NSString *msg))block{
    NSLog(@"方法2的实现 -- %@", title);
    block(@"block的调用--传递数据data");
}

block参数的类型就是括号里的一串。这样就把一个函数(用block的写法)作为参数传给另外一个参数了。

3.回调
理解了函数的定义、实现、调用,函数作为参数传递给另外一个函数,就该说回调了。
重点:当A函数作为B函数的参数,那么A函数就具有了回调的功能。由于函数作为参数必须写成block格式,所以一般说block具有回调的功能。
上面说了,函数的使用包括定义、实现、调用3步。一般定义和实现写一块。
调用写在需要调用的地方。也就是说函数的调用和实现是分开的。
比如第一部分介绍普通函数的部分,定义实现完了,调用的时候才走实现的部分,这点很重要。
函数A:(即block)
void(^)(NSString *msg)
把A函数作为另外一个函数的参数,如下:
函数B:
//B的定义和实现

- (void)testFunction2WithParameter:(NSString *)title testBlock:(void(^)(NSString *msg))block{
    NSLog(@"方法2的实现 -- %@", title);
    block(@"block的调用--传递数据data");
}

函数B的调用

    [self testFunction2WithParameter:@"方法2" testBlock:^(NSString *msg) {
        NSLog(@"block的实现");
        NSLog(@"方法2的调用 -- %@", msg);
    }];

后面的大括号其实是A函数的实现部分,这种block的写法,其实把函数的定义、实现、调用都分开了。而一般函数定义和实现是写一块的,比如B函数。
但是实现和调用都是分开的,这点没变。都是通过调用函数去实现大括号{ }里面的代码。

通过观察:可以得到:
1.B函数的实现里面写了block的调用,
2.B函数的调用的时候,把block实现了。
会出现什么情况?

按代码的执行顺序
第一步、在viewDidLoad里调用B函数,这是需要跳到B函数的实现部分,即大括号里
第二步、在B函数的实现里面,发现了A函数block的调用
第三步、既然有调用,必须去寻找怎么实现的,就跳到了A函数的实现部分
第四步、发现A的实现部分在B函数的调用后面,所以代码又回到了B函数的调用部分,回到了第一步的代码部分viewDidLoad里。这就实现了回调。

C41BE5D5-C24D-49BD-843C-CB3B71BCC1C9.png

如果block带有参数,就把这个参数回调了B函数的执行地方,可以传递数据,这就实现了传递数据的功能。例如上面的函数传了个字符串。比如一些网络请求方法,通过写一个block就能把请求的数据传递到这个请求方法调用的地方,就算是得到了数据。

swift闭包一个道理,捋一捋就通了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容