我一直在网上搜索,研究如何使用块。我还决定建立一个基本的例子来尝试和理解它们的工作方式。
基本上我想要做的是有一个'块变量'(不确定这是否是正确的术语),我可以在其中存储一段代码。然后,我希望能够在代码中的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
都属于单例类。
注意:这只是一个尝试理解块工作的虚拟示例,我完全清楚还有其他方法可以实现相同的结果。
答案 0 :(得分:4)
这是代码,只是为了清楚:
- (void)methodX
{
if(self.completionBlock)
self.completionBlock();
}
答案 1 :(得分:2)
我想你想在self.completionBlock();
中做methodX
。