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

}

最後に、ClassA で:

[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 に答える