一、Block定义

Block可以理解为一个函数指针(即它是一个指针,指向某个函数)

returnType (^blockName) (parameter list) = ^ (parameter list) {代码块};
//returnType:block的返回类型,可定义为void;
//blockName:block的命名,可根据不同的变量/函数命名规范进行命名;
//parameter list:block形参类型定义,可传入多个值,也可没有参数;

举例说明:

//定义无参无返回值的Block
void (^printBlock)() = ^(){
  printf("no number");
};
printBlock(); void (^myBlock)(NSString *); //block 声明 - (void)viewDidLoad
{
  //block 在代码中的实现
  myBlock = ^(NSString *text){
    NSLog(@"my text = %@", text);
  };
  //调用block函数的实现
  int nCount = myCount(, );
  NSLog(@"count = %zi", nCount);
} //block函数原型定义
int (^myCount)(int a, int b) = ^(int a, int b)
{
  return a+b;
};

二、Block作为函数参数传递

returnType (^blockName) (parameter list)
//returnType:block的返回类型,可定义为void;
//blockName:block的命名,可根据不同的变量/函数命名规范进行命名;
//parameter list:block形参类型定义,可传入多个值,也可没有参数;

实际声明方式:

+ (void)updateImage:(void(^)(NSInteger status,NSDictionary *res))block;

//变更网络请求方式
-(void)ModifyRequestMode:(void(^)())block
{
  //取消所有任务,放到全局队列中优先级最高
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, ), ^{
    ZLBAFHTTPClient *httpClient = [ZLBAFHTTPClient shareClient];
    //取消队列中的所有网络请求任务
    [httpClient cancelAllTasks];
    //取消队列中所有任务
    [httpClient.workQueue cancelAllOperations];
    //重新匹配正确的CDN节点
    [[ZLBGlobal sharedGlobal] changeNetwork:^{
    block();
    }];
  });
} - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock completed:(void (^)(void))completedBlock {
  NSCParameterAssert(nextBlock != NULL);
  NSCParameterAssert(completedBlock != NULL);   RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:completedBlock];
  return [self subscribe:o];
}

实现简单的相应是block函数:

@property(nonatomic, strong) RACSubject *subject;

self.subject = [RACSubject subject]; //初始化信号

//响应式block回调
-(void)finishModel:(void(^)(void))block{
//接收到信号后,返回block
[self.subject subscribeNext:^(id _Nullable x) {
return block();
}];
} //动画结束后,发送完成信号
[UIView animateWithDuration:animalDuration animations:^{
self.alphView.alpha = 0.0;
self.bkView.frame = CGRectMake(, kMainBoundsHeight, kMainBoundsWidth, );
[self.imageView mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.height.offset();
}];
[self layoutIfNeeded];
} completion:^(BOOL finished) {
[self.imageView stopAnimating];
[self removeFromSuperview];
[self.subject sendNext:@]; //发送信号
}]; //代码实现
[_showView finishModel:^{
NSLog(@"close show");
}];

block 应用说明的更多相关文章

  1. Objective-C中block的底层原理

    先出2个考题: 1. 上面打印的是几,captureNum2 出去作用域后是否被销毁?为什么? 同样类型的题目: 问:打印的数字为多少? 有人会回答:mutArray是captureObject方法的 ...

  2. iOS 键盘添加完成按钮,delegate和block回调

    这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...

  3. python中IndentationError: expected an indented block错误的解决方法

    IndentationError: expected an indented block 翻译为IndentationError:预期的缩进块 解决方法:有冒号的下一行要缩进,该缩进就缩进

  4. JDBC Tutorials: Commit or Rollback transaction in finally block

    http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html JDBC Tutorials: Com ...

  5. 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比

    C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...

  6. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  7. Block解析(iOS)

    1. 操作系统中的栈和堆 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方 ...

  8. CSS学习笔记——包含块 containing block

    以下内容翻译自CSS 2.1官方文档.网址:https://www.w3.org/TR/CSS2/visudet.html#strut 有时,一个元素的盒子的位置和尺寸根据一个确定的矩形计算,这个确定 ...

  9. 用block做事件回调来简化代码,提高开发效率

       我们在自定义view的时候,通常要考虑view的封装复用,所以如何把view的事件回调给Controller就是个需要好好考虑的问题, 一般来说,可选的方式主要有target-action和de ...

  10. 关于多个block问题

    在某个添加文本的页面中,leftbarbutton是删除(直接将数组中的这个string删除),rightbarbutton是完成,分别对应两个block,完成的block是一开始写的,写到了view ...

随机推荐

  1. mtk lk阶段的lcm流程

    一.lk进入kmain() 1. vendor/mediatek/proprietary/bootable/bootloader/lk/arch/arm/srt0.S bl kmain 二.初始化lk ...

  2. 修改Linux内核参数提高Nginx服务器在高的时候的性能

    并发 Linux下高并发的Nginx服务器,当TCP TIME_WAIT套接字数量经常达到两.三万,服务器很容易被拖死.通过修改Linux内核参数,可以减少Nginx服务器的TIME_WAIT套接字数 ...

  3. <正则吃饺子> :关于前端往后端传递布尔值参数的问题

    问题是在一个群里看到的,通过自己查找和实验,参考网上的博文,将问题列出来.以帮助后来者和共同交流学习.   博文地址:http://blog.sina.com.cn/s/blog_13c30757a0 ...

  4. 华为CodeCraft2018 周进展

    上周: python验证lstm,效果不好.很多拟合的是直线.C++抄了个lstm,输出也是直线,不知道是程序的问题,还是模型的问题. 尝试bp神经网络求解.代码是抄的.回看天数是写死的,隐层只有一层 ...

  5. windows下mysql5.1忘记root密码解决方法[win7]

    步骤如下:1.停止mysql服务(以管理员身份,在cmd命令行下运行) net stop mysql2.使用 mysqld –skip-grant-tables 命令启动mysql数据库 D:\> ...

  6. g2o使用bug总结

    g2o进行3d2d优化的时候,设置优化图的边时,注意setVertex()中顶点的顺序. void setVertex(size_t i, Vertex* v) { assert(i < _ve ...

  7. python 之enumerate函数

    对于一个seq,得到: (0, seq[0]), (1, seq[1]), (2, seq[2]) list1 = ["这", "是", "一个&qu ...

  8. Several ports (8005, 8080, 8009) required

    Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The ...

  9. POJ 3262 Protecting the Flowers 贪心(性价比)

    Protecting the Flowers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7812   Accepted: ...

  10. eclipse + tomcat 开发环境配置

    一. 下载tomcat和Eclipse 下载tomcat 下载地址:http://tomcat.apache.org/download-70.cgi 下载后解压如下图 下载eclipse 下载地址:h ...