私はオンラインで周りを見回し、ブロックの使い方を研究しています。また、それらがどのように機能するかを理解するための基本的な例を設定することにしました。
基本的に私がやりたいのは、コードのブロックを格納できる「ブロック変数」(それが正しい用語かどうかはわかりません)を用意することです。次に、このブロックのコードをコードのpointX(methodA
またはmethodB
)に設定してから、コードのブロックをpointY()で実行できるようにしますmethodX
。
具体的には、私の質問は3つあります
- 以下の例を使用すると、ブロックのセットアップ/使用法は正しく有効ですか?
- ブロック()内のコードを実行するには
methodX
どうすればよいself.completionBlock
ですか? - でブロックを作成するとき
methodA
、methodB
コードはそこで呼び出されますか?もしそうなら、どうすればこれが起こらないようにすることができますか(私がしたいのは、後で呼び出されるようにブロック内のコードを設定することだけです)?
ブロックがどのように使用されているかを完全に誤解している可能性があります。その場合はお詫びしますが、Objective-Cは比較的新しいので、学習しようとしています。
これまでの私のコードは次のとおりです。
.h
typedef void (^ CompletionBlock)();
@interface TestClass : NSObject
{
CompletionBlock completionBlock;
NSString *stringOfText;
NSString *otherStringOfText;
}
@property(nonatomic, copy)CompletionBlock completionBlock;
@property(nonatomic, retain)NSString *stringOfText;
@property(nonatomic, retain)NSString *otherStringOfText;
- (void)methodA:(NSString *)myText;
- (void)methodB:(NSString *)myText and:(NSString *)myOtherText;
- (void)methodX;
@end
.m
- (void)methodA:(NSString *)myText;
{
if ([self.stringOfText isEqualToString:@""])
{
// Set the variable to be used by the completion block
self.stringOfText = @"I visited methodA"; // normally make use of myText
// Create the completion block
__block TestClass *blocksafeSelf = self;
self.completionBlock = ^()
{
[blocksafeSelf methodA:blocksafeSelf.stringOfText];
blocksafeSelf.stringOfText = nil;
};
}
else
{
// Do some other stuff with self.stringOfText
}
}
- (void)methodB:(NSString *)myText and:(NSString *)myOtherText;
{
if ([self.stringOfText isEqualToString:@""] || [self.otherStringOfText isEqualToString:@""])
{
// Set the variable to be used by the completion block
self.stringOfText = @"I visited methodB"; // normally make use of myText
self.otherStringOfText = @"I also visited methodB"; // normally make use of myOtherText
// Create the completion block
__block TestClass *blocksafeSelf = self;
self.completionBlock = ^()
{
[blocksafeSelf methodB:blocksafeSelf.stringOfText and:blocksafeSelf.otherStringOfText];
blocksafeSelf.stringOfText = nil;
blocksafeSelf.otherStringOfText = nil;
};
}
else
{
// Do some other stuff with self.stringOfText and self.otherStringOfText
}
}
- (void)methodX
{
// At this point run the block of code in self.completionBlock...how?!
}
私の例では、methodA
またはmethodB
が最初に呼び出されます。その後、しばらくして(おそらく別のクラスから)methodX
呼び出されます(呼び出された後、methodA
またはmethodB
呼び出された後のみ)。
メソッドとはすべてシングルトンクラスに含まれていることに注意しmethodA
てくださいmethodB
。methodX
注:これは、ブロックの動作を理解するための単なるダミーの例です。同じ結果を達成する他の方法があることを十分に認識しています。