Objective-C阻止使用

时间:2012-05-17 11:48:46

标签: objective-c objective-c-blocks

我一直在网上搜索,研究如何使用块。我还决定建立一个基本的例子来尝试和理解它们的工作方式。

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

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

  1. 使用以下示例是块的设置/使用是否正确且有效?
  2. methodX中如何执行块内的代码(self.completionBlock)?
  3. methodAmethodB中创建块时,会在那里调用代码吗?如果是这样,我怎么能阻止这种情况发生(我想要做的就是在块中设置代码以便稍后调用)?
  4. 我可能完全误解了块是如何使用的,如果是这种情况就道歉,但是我对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都属于单例类。

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

2 个答案:

答案 0 :(得分:4)

这是代码,只是为了清楚:

- (void)methodX
{
    if(self.completionBlock)
        self.completionBlock();
}

答案 1 :(得分:2)

我想你想在self.completionBlock();中做methodX