我一直在网上四处寻找,研究如何使用积木。我还决定建立一个基本示例来尝试了解它们的工作方式。
基本上我想要做的是有一个“块变量”(不确定这是否是正确的术语),我可以在其中存储一个代码块。然后,我希望能够在我的代码中的 pointX (methodA
或methodB
) 处设置此块中的代码,然后在 pointY ( methodX
) 处运行代码块。
所以具体来说,我的问题是 3-fold
- 使用下面的示例,块的设置/使用是否正确且有效?
- 在
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
在一个单例类中。
注意:这只是一个尝试理解块工作的虚拟示例,我完全知道还有其他方法可以达到相同的结果。