1

我一直在网上四处寻找,研究如何使用积木。我还决定建立一个基本示例来尝试了解它们的工作方式。

基本上我想要做的是有一个“块变量”(不确定这是否是正确的术语),我可以在其中存储一个代码块。然后,我希望能够在我的代码中的 pointX (methodAmethodB) 处设置此块中的代码,然后在 pointY ( methodX) 处运行代码块。

所以具体来说,我的问题是 3-fold

  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?!
}

在我的示例中,要么methodAmethodB将首先被调用。然后一段时间后(可能来自不同的类)methodX将被调用(仅在之后methodAmethodB已经被调用)。

值得注意的是,方法methodAmethodBmethodX在一个单例类中。

注意:这只是一个尝试理解块工作的虚拟示例,我完全知道还有其他方法可以达到相同的结果。

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 回答