Block 简单用法 和 回调用法

//
//  BlocksDemo.h
//  OC基础学习
//
//  Created by 麦子 on 15/6/8.
//  Copyright (c) 2015年 麦子. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface BlocksDemo : NSObject


- (id)init;


- (void)setBlocks;

- (void)blockCallBackDemo;


@end
//
//  BlocksDemo.m
//  OC基础学习
//
//  Created by 麦子 on 15/6/8.
//  Copyright (c) 2015年 麦子. All rights reserved.
//

#import "BlocksDemo.h"
#import "Water.h"
#import "ChilderPerson.h"

typedef  int (^SumBlock) (int a,int b);

@implementation BlocksDemo

- (id)init{
    self = [super init];
    if (self != nil) {
        [self setBlocks];
    }
    return self;
}


/*****
    Block  用法
    这种形式和Java处理中类似于,在一个方法中,传入一个接口类。 在我们需要他的时候,需要实现这个接口中的方法。
 
    这种形式就是相当于java中的回调的写法。方法传入接口或者是set设置接口类。 
 
    在调用的地方,才去实现它。 
 
 ****/
- (void)setBlocks{
  
    // 没有参数的
    void (^myblocks) (void) = nil;
    myblocks = ^(void){
    
        NSLog(@"没有参数的block调用");
    };
    myblocks(); // 调用
    
    // 有参数的形式
    int (^myblocks2)(int a,int b) = ^(int a, int b){
        
        return  a + b;
    
    };
    
    int val = myblocks2(10,10);
    NSLog(@"有参数的值val--%d",val);
    
    
    // 修改外部的值
    __block int count = 100;
    
    int (^myblock3)(int a,int b) = ^(int a,int b){
    
        count = a + b;
        
        return count;
    
    };
    
    myblock3(300,100);
    NSLog(@"修改外部变量值---%d",count);
    
    SumBlock  sumblcok = ^(int a,int b){
    
        NSLog(@"typedef定义---count---%d",a+b);
        
        return a+b;
    
    };
    sumblcok(10,90);

}

/***
     回调处理: 实现, 水的深度在不停的升高, 小孩的不同的反应。 对于这一块的业务处理在小孩的这个类。
 */
- (void)blockCallBackDemo{
    ChilderPerson *person =  [[ChilderPerson alloc] init];
    Water *water = [[Water alloc] init];
    
    WaterCallBack callback =  ^(int waterDeepVal){
    
        NSLog(@"回调成功----%d-----",waterDeepVal);
    };
    [water setCallback:callback];
    [person setWater:water];
    [[NSRunLoop currentRunLoop] run];
}


@end

//
//  Water.h
//  OC基础学习
//
//  Created by 麦子 on 15/6/8.
//  Copyright (c) 2015年 麦子. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef void (^WaterCallBack) (int waterDeepVal);

@interface Water : NSObject

@property(nonatomic) int waterDeepVal;
@property(nonatomic) WaterCallBack callback;


- (id)init;


@end

//
//  Water.m
//  OC基础学习
//
//  Created by 麦子 on 15/6/8.
//  Copyright (c) 2015年 麦子. All rights reserved.
//

#import "Water.h"

@implementation Water

@synthesize waterDeepVal;
@synthesize callback;

- (id)init{
    self = [super init];
    if (self != nil) {
        
        [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeAction:) userInfo:nil repeats:YES];
        
    }
    return self;
}


- (void)timeAction:(NSTimer *) timer{
    self.waterDeepVal++;
    NSLog(@"水深----%d",self.waterDeepVal);
    callback(self.waterDeepVal);// 在这里处理回调
}

@end

//
//  ChilderPerson.h
//  OC基础学习
//
//  Created by 麦子 on 15/6/8.
//  Copyright (c) 2015年 麦子. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Water.h"

@interface ChilderPerson : NSObject

@property(nonatomic,retain) Water *water;


@end

//
//  ChilderPerson.m
//  OC基础学习
//
//  Created by 麦子 on 15/6/8.
//  Copyright (c) 2015年 麦子. All rights reserved.
//

#import "ChilderPerson.h"


@implementation ChilderPerson
@synthesize water;


@end

BlocksDemo *blockDemo = [[BlocksDemo alloc] init];
        [blockDemo blockCallBackDemo]; 


运行结果如下:

2015-06-08 15:40:52.344 OC基础学习[1904:119454] 没有参数的block调用

2015-06-08 15:40:52.345 OC基础学习[1904:119454] 有参数的值val--20

2015-06-08 15:40:52.345 OC基础学习[1904:119454] 修改外部变量值---400

2015-06-08 15:40:52.345 OC基础学习[1904:119454] typedef定义---count---100

2015-06-08 15:40:53.350 OC基础学习[1904:119454] 水深----1

2015-06-08 15:40:53.350 OC基础学习[1904:119454] 回调成功----1-----

2015-06-08 15:40:54.347 OC基础学习[1904:119454] 水深----2

2015-06-08 15:40:54.347 OC基础学习[1904:119454] 回调成功----2-----

2015-06-08 15:40:55.350 OC基础学习[1904:119454] 水深----3

2015-06-08 15:40:55.351 OC基础学习[1904:119454] 回调成功----3-----

Program ended with exit code: 9


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在iOS开发中,可以使用Block和delegate来实现一对多的回调。使用delegate时,首先需要定义一个delegate协议,其中包含回调方法。然后在需要进行回调的地方,设置delegate并调用回调方法。具体实现可以参考以下代码示例:\[2\] ``` // 定义delegate协议 protocol FirstCellDelegate: class { func firstCellBtnTap(_ cell: firstTableViewCell) } // 在需要进行回调的地方设置delegate并调用回调方法 weak var delegate: FirstCellDelegate? // 调用回调方法 if let delegate = self.delegate { delegate.firstCellBtnTap(self) } // 实现delegate回调方法 func firstCellBtnTap(_ cell: firstTableViewCell) { let cellIndexPath = tableView.indexPath(for: cell) print("delegate回调 section:\(cellIndexPath?.section ?? 0), row:\(cellIndexPath?.row ?? 0)") } ``` 另外,使用Block也可以实现一对多的回调Block可以作为函数表达式传递给API,可以选择性地存储,并且可以被多个线程使用。Block不仅包含了在回调时需要执行的代码,还包含了执行期间所需的数据。具体实现可以参考以下代码示例:\[3\] ``` // 定义Block回调 typealias CallbackBlock = () -> Void // 在需要进行回调的地方使用Block进行回调 var callback: CallbackBlock? // 调用回调 callback?() ``` 通过使用Block和delegate,可以实现一对多的回调,满足不同场景下的需求。 #### 引用[.reference_title] - *1* [Block实现iOS回调](https://blog.csdn.net/feelinghappy/article/details/119870367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [iOS Block与Delegate的用法,各自优缺点及使用场景](https://blog.csdn.net/huangshanfeng/article/details/82106580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值