iOS Inter-Class Block Signaling

时间:2012-11-29 03:55:41

标签: ios objective-c-blocks block

我尽可能多地阅读过积木,但是我似乎无法理解这个概念。我经常使用块来利用块来调用对象所有者类中的成功和失败块。

所以,我说ClassA的变量为ClassB。我打电话给[ClassB method1]。为method1添加运行成功块的能力,假设一切顺利在method1内,必须放入什么?如何知道调用写入ClassA的成功块?任何例子都会很棒。

2 个答案:

答案 0 :(得分:2)

这是一个粗略而快速的例子。

在ClassB.h中使用成功/失败块定义函数:

- (void)doSomethingOnSuccess:(void (^)(NSString *resultString))success
                     failure:(void (^)(NSError *error))failure;

在ClassB.m中:

- (void)doSomethingOnSuccess:(void (^)(NSString *resultString))success
                     failure:(void (^)(NSError *error))failure
{
  // Do some task
  BOOL taskSucceed = [self doSomeTask];
  if (taskSucceed) {
    NSString *result = @"done";
    // Check for success block
    if (success) 
      success(result);
  } else {
    // Generate error
    NSError *error = ...;
    if (failure)
      failure(error);
  }

}

最后,在ClassA中:

[ClassB doSomethingOnSuccess:^(NSString *resultString) {
  // method succeeded
} failure:^(NSError *error) {
  // something failed
}

答案 1 :(得分:0)

只需将块视为一个代码块,您可以随时存储和执行。所以你的课程可能如下:

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之前检查您是否已经有一个块。希望这有帮助!