zoukankan      html  css  js  c++  java
  • block 应用说明

    一、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(10, 5);
      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, 0), ^{
        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(0, kMainBoundsHeight, kMainBoundsWidth, 500);
            [self.imageView mas_updateConstraints:^(MASConstraintMaker *make) {
                make.width.height.offset(0);
            }];
            [self layoutIfNeeded];
    } completion:^(BOOL finished) {
            [self.imageView stopAnimating];
            [self removeFromSuperview];
            [self.subject sendNext:@1]; //发送信号
    }];
        
        
    //代码实现
    [_showView finishModel:^{
        NSLog(@"close show");
    }];
  • 相关阅读:
    python线程同步
    闭包、装饰器
    python中的return返回值
    常用内建函数
    python迭代器与生成器
    python基础之数据类型
    VS生成解决方案时报错: Your project does not reference ".NETFramework,Version=v4.5"
    Unity 低版本打开高版本项目
    关闭应用程序的所有子窗体
    按钮接收 Enter 键
  • 原文地址:https://www.cnblogs.com/xujinzhong/p/8416773.html
Copyright © 2011-2022 走看看