1

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

所以,假设我有ClassA一个变量ClassB. 我打电话[ClassB method1]method1假设一切顺利,为了增加运行成功块的能力,究竟必须投入什么method1?它如何知道调用写入的成功块ClassA?任何例子都会很棒。

4

2 回答 2

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);
  }

}

最后,在 A 类中:

[ClassB doSomethingOnSuccess:^(NSString *resultString) {
  // method succeeded
} failure:^(NSError *error) {
  // something failed
}
于 2012-11-29T04:16:34.347 回答
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。希望这可以帮助!

于 2012-11-29T04:16:57.143 回答