我对基于块的回调不了解。我似乎知道有两种方法,我不知道什么时候应该使用另一种,所以有人可以向我解释这两种方法之间的区别,纠正我并在需要时给我一些提示任何。
我从 stackoverflow 以及其他地方的库中找到了一些代码,因此感谢编写此代码的人。
typedef void (^MyClickedIndexBlock)(NSInteger index);
@interface YourInterface : YourSuperClass
@property (nonatomic, strong) MyClickedIndexBlock clickedIndexBlock
.m
//where you have to call the block
if (self.clickedIndexBlock != nil) {self.clickedIndexBlock(buttonIndex)};
// where you want to receive the callback
alert.clickedIndexBlock = ^(NSInteger index){NSLog(@"%d", index);};
我对上述内容的理解是:
MyClickedIndexBlock 是 NSInteger 的 typedef。以 MyClickedIndexBlock 类型的名称“clickedIndexBlock”创建的属性(意味着 clickedIndexBlock 可以是一个数字)。
块也可以用作方法,这就是为什么我可以调用 self.clickedIndexBlock(buttonIndex);
但是有些东西告诉我,这种作为@property 的方法只真正支持一个参数,例如。NS 整数。
鉴于以下方法允许使用多个参数。
蓝牙Me.h
typedef void (^hardwareStatusBlock)(CBPeripheral *peripheral, BLUETOOTH_STATUS status, NSError *error);
- (void)hardwareResponse:(hardwareStatusBlock)block;
蓝牙Me.m
- (void)hardwareResponse:(hardwareStatusBlock)block {
privateBlock = [block copy];
}
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
NSLog(@"Did connect to peripheral: %@", peripheral);
privateBlock(peripheral, BLUETOOTH_STATUS_CONNECTED, nil);
NSLog(@"Connected");
[peripheral setDelegate:self];
[peripheral discoverServices:nil];
}
我的理解是创建一个强大的属性并执行 [块复制] 将保留该块,直到应用程序终止。所以 [block copy] 和 strong 都保留。[块复制] 应用于块以保留,否则当方法超出范围时块将消失。
视图控制器.m
[instance hardwareResponse:^(CBPeripheral *peripheral, BLUETOOTH_STATUS status, NSError *error) {
if (status == BLUETOOTH_STATUS_CONNECTED)
{
NSLog(@"connected!");
}
else if (status == BLUETOOTH_STATUS_FAIL_TO_CONNECT)
{
NSLog(@"fail to connect!");
}
else
{
NSLog(@"disconnected!");
}
NSLog(@"CBUUID: %@, ERROR: %@", (NSString *)peripheral.UUID, error.localizedDescription);
}];
那么让我们看看我的问题是什么:
1)我什么时候会选择第一种方法而不是第二种方法,反之亦然?
2)第一个例子,块是一个属性的类型定义。第二个例子,块被声明为一个方法。为什么第一个示例不能声明为方法,为什么第二个示例不能为属性的 typedef?
3) 我需要为我想要基于块的回调的每种类型的委托方法创建一个 typedef 吗?
4) 迄今为止,我只看到支持一种委托方法。如果我要在多个不相似的委托方法上创建基于块的回调,您能否向我展示一个如何实现每种方法的示例。
感谢您的反馈。这有时很难。需要尽可能多的帮助。谢谢,
本