ブロックベースのコールバックについてよく理解していません。私が知っているアプローチは2つあるようですが、どちらを使用すればよいかわからないので、誰かが2つの違いを説明してくれ、訂正して、必要に応じてヒントを教えてください。どれか。
私が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としてのこのアプローチは、実際には1つのパラメーターしかサポートしていないことがわかります。NSInteger。
一方、次のアプローチでは複数のパラメーターを使用できます。
bluetoothMe.h
typedef void (^hardwareStatusBlock)(CBPeripheral *peripheral, BLUETOOTH_STATUS status, NSError *error);
- (void)hardwareResponse:(hardwareStatusBlock)block;
bluetoothMe.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];
}
強力なプロパティを作成して[ブロックコピー]を実行すると、アプリが終了するまでブロックが保持されることを理解しています。したがって、[ブロックコピー]と強力な両方が保持されます。[ブロックコピー]はブロックに適用されて保持されます。そうしないと、メソッドがスコープ外になったときにブロックが消えてしまいます。
ViewController.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番目のアプローチよりも最初のアプローチを選択するのはいつですか?その逆もありますか?
2)最初の例では、ブロックはプロパティのtypedefでした。2番目の例では、ブロックがメソッドとして宣言されました。最初の例をメソッドとして宣言できなかったのはなぜですか。また、2番目の例をプロパティのtypedefにできないのはなぜですか。
3)ブロックベースのコールバックが必要なすべてのタイプのデリゲートメソッドに対してtypedefを作成する必要がありますか?
4)現在、iveは1つのデリゲートメソッドのみがサポートされていることを確認しました。類似していない複数のデリゲートメソッドでブロックベースのコールバックを作成する場合に、各アプローチを実装する方法の例を教えてください。
フィードバックに感謝します。これは時々難しいです。私が得ることができる限り多くの助けが必要です。ありがとう、
ベン