1

私はオンラインで周りを見回し、ブロックの使い方を研究しています。また、それらがどのように機能するかを理解するための基本的な例を設定することにしました。

基本的に私がやりたいのは、コードのブロックを格納できる「ブロック変数」(それが正しい用語かどうかはわかりません)を用意することです。次に、このブロックのコードをコードのpointX(methodAまたはmethodB)に設定してから、コードのブロックをpointY()で実行できるようにしますmethodX

具体的には、私の質問は3つあります

  1. 以下の例を使用すると、ブロックのセットアップ/使用法は正しく有効ですか?
  2. ブロック()内のコードを実行するにはmethodXどうすればよいself.completionBlockですか?
  3. でブロックを作成するときmethodAmethodBコードはそこで呼び出されますか?もしそうなら、どうすればこれが起こらないようにすることができますか(私がしたいのは、後で呼び出されるようにブロック内のコードを設定することだけです)?

ブロックがどのように使用されているかを完全に誤解している可能性があります。その場合はお詫びしますが、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てくださいmethodBmethodX

注:これは、ブロックの動作を理解するための単なるダミーの例です。同じ結果を達成する他の方法があることを十分に認識しています。

4

2 に答える 2

4

明確にするために、コードは次のとおりです。

- (void)methodX
{
    if(self.completionBlock)
        self.completionBlock();
}
于 2012-05-17T12:28:16.833 に答える
2

self.completionBlock();でやりたいと思いますmethodX

于 2012-05-17T12:04:43.847 に答える