0

我有一个实例方法,我想直接使用来自objective-c 中的块的回调参数调用。当我需要在回调中做的不仅仅是简单的 1 行时,我更喜欢这种方法。

这是基本设置...

我用某种类型的回调初始化一个类,这样我就可以在 http 请求之后解析 json 让我们说

- (void)initFooAndDoStuff {
    Foo *foo = [[Foo alloc] initWithCallback:^(NSData * response){
        // do stuff
    }];
}

//this is the instance method I'd like to invoke instead of an inline function
- (void)callBackWithHttpResponse:(NSData *)response {
    // do stuff ... assuming it's more complex than a 1 liner that is
}

我可以设置一个内联的回调(但更复杂的东西在独立的实例方法中可能会更好)

Foo *foo = [[Foo alloc] initWithCallback:^(NSData * response){ 
    NSLog(@"foo"); 
}];

我可以使用下面的实例方法,但感觉有点啰嗦。我可以通过任何方式减少它(即语法)。

Foo *foo = [[Foo alloc] initWithCallback:^(NSData * response){ 
    [self callBackWithHttpResponse:response]; 
}];
4

2 回答 2

2

如果您要将实现放在一个方法中,您不妨让该方法返回整个块:

-(void (^)(NSData *))httpResponseHandler {
    return ^(NSData *responseData){
        // do something with responseData
    };
}

那么你使用它的地方会更简洁一些:

Foo *foo = [[Foo alloc] initWithCallback:[self httpResponseHandler]]; 
于 2012-06-18T17:02:48.410 回答
1
Foo *foo = [[Foo alloc] initWithCallback:^(NSData * response){ 
    [self callBackWithHttpResponse:response]; 
}];

好的——它的可读性非常好。

现在,进入另一个房间,用砖头敲击自己的头部 3 次,以模拟在 6 个月到一年内没有看过这个项目。

现在,再次阅读代码。

仍然可读,不是吗?

当冗长准确地说明代码在做什么时,有点冗长并没有错。您可以按照 Ken Thomases 的建议采用目标/动作模式,但这需要在其他地方增加额外的复杂性。

而不是callback,我会将其更改为更具体。即如果回调真的是一个完成处理程序:

Foo *foo = [[Foo alloc] initWithHTTPResponseCompletionHandler:^(NSData * response){ 
    [self httpResponseCompletionHandler:response]; 
}];
于 2012-06-17T00:09:43.280 回答