zoukankan      html  css  js  c++  java
  • 整理IOS中Block用作属性、传值、回调用法

    1.block用作属性 封装一段代码

    在模型类中声明block属性 ,注意block的属性要使用copy否则会出问题

    @property (copy, nonatomic) void (^actionBlock)();

    
    
    

    @property (copy, nonatomic) void (^actionWithPapameterBlock)(int papameter);

    @property (copy,nonatomic) NSString *(^actionToReturnStirng)();

     

    其他控制器创建模型类对象,并且为block属性赋予一段代码 。曾经为cell的模型类添加了block属性后,将点击cell跳转的控制器封装到块代码中,调用起来十分方便。

     //无返回值无参数block

        _model = [[Modelalloc]init];

        

        _model.actionBlock = ^{

            NSLog(@"actionBlock");

        };

        

        //无返回值有参数block

        _model.actionWithPapameterBlock = ^(int a){

            NSLog(@"%d",a);

        };

        

        //有返回值

        _model.actionToReturnStirng = ^{

          

            return@"hello";

        };

    在其他方法中调用block

    - (IBAction)tapBtn:(id)sender

    {

        _model.actionBlock();

        

        _model.actionWithPapameterBlock(10);

        

         NSLog(@"%@",_model.actionToReturnStirng());

        

    }

    2.控制器传值 

     在需要传值的控制器定义block,此处传递UITextField中输入的NSString,并且声明初始化方法

    typedefvoid(^textFieldChangedBlock)(NSString *text);

    -(id)initWithBlock:(textFieldChangedBlock)block;

    实现文件中用成员变量记录block

    @implementation Model{

        textFieldChangedBlock _changedBlock;

    }

    - (id)initWithBlock:(textFieldChangedBlock)block

    {

        self = [super init];  

        if (self) {

            _changedBlock = block;

        }

          return self;

    }

    执行block

    - (void)click

    {    //返回

         _changedBlock(self.textFiled.text);

         [self dismissViewControllerAnimated:YES completion:nil];

    }

    Block传值,在需要显示textfield内容的控制器实例化存储有block的类

        DetailViewController *detail = [[DetailViewController alloc]initWithBlock:^(NSString *text) {

            

            [self.label setText:text];

        }];

    3.曾在用sprite kit加载scene素材时用到了block

    //主控制器中利用自定义scene提供的方法加载场景素材

        [scene loadSceneAssetsWithCompletionHandler:^{

            

            scene.scaleMode =SKSceneScaleModeAspectFill;

            [skView presentScene:scene];

        }];

    // block实现

    typedefvoid(^AssetLoadCompletionHandler)(void);

    - (void)loadSceneAssetsWithCompletionHandler:(AssetLoadCompletionHandler)callback

    {

          dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

              

              [selfloadSceneAssets]; 

              

              if (callback) {     

                 dispatch_async(dispatch_get_main_queue(), ^{

                    callback();//回调

                  });

              }     

          });

    }

  • 相关阅读:
    使用MAT 分析内存泄漏实战
    测试面试题集锦----liunx与网络
    Python中request的post请求报requests.exceptions.SSLError:
    python 中requests的返回数可直接使用json
    unittest中的TestLoader使用
    3秒钟unittest入门使用
    postman做接口测试 application/x-www-form-urlencoded 格式与json格式互转
    python读取yaml文件,在unittest中使用
    python 传入任意多个参数(方法调用可传参或不传参)
    boost写的异步客户端样例代码修改为支持断开重连的代码
  • 原文地址:https://www.cnblogs.com/jordanYang/p/5599356.html
Copyright © 2011-2022 走看看