ブロックは、いつでも保存して実行できるコードのブロックと考えてください。したがって、クラスは次のようになります。
ClassA.m
- (void)someMethod
{
ClassB *obj = [ClassB new];
[obj doSomethingAndThen:^(BOOL success) {
if (success) {
NSLog(@"WIN!");
}
else {
NSLog(@"Oh no");
}
}
}
ClassB.h
typedef void (^SuccessBlock)(BOOL success);
@interface ClassB : NSObject
@property (nonatomic, copy) SuccessBlock successBlock;
- (void)doSomethingAndThen:(SuccessBlock)block;
@end
ClassB.m
@interface ClassB
- (void)doSomethingAndThen:(SuccessBlock)block
{
self.successBlock = block;
// Assume LRThing is something like NSURLConnection
LRThing *thing = [LRThing new];
thing.delegate = self;
[thing start];
}
- (void)longRunnigThingDidEnd
{
if (_successBlock) {
_successBlock(YES);
self.successBlock = nil;
}
}
- (void)longRunningThingDidFail
{
if (_successBlock) {
_successBlock(NO);
self.successBlock = nil;
}
}
@end
これは非常に単純な例であり、明らかに、より多くのチェックを行う必要があります。たとえば、ブロックを に割り当てる前に、既にブロックがあるかどうかをチェックしますself.successBlock
。お役に立てれば!