是否可以使用方法代替块?

时间:2011-12-20 15:59:46

标签: objective-c objective-c-blocks

在Objective-C中,是否可以使用方法代替块?

因此,例如,不是定义一个块,而是调用方法:

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) {
                           [self processTwitterSearchResponse:response data:responseData error:error];
                       }
 ];

直接调用该方法:

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:(processTwitterSearchResponse:response data:responseData error:error)
 ];

或者其他一些。

3 个答案:

答案 0 :(得分:1)

不。如果该方法将块作为其处理程序,则需要为其提供一个块。为什么呢?

有一些方法可以使用函数指针而不是块,比如NSArray的-sortedArrayUsingFunction:context:(而不是基于块的-sortedArrayUsingComparator:),但你绝对不能只交换方法签名它需要一个区块。

答案 1 :(得分:1)

总之,没有。

如果该方法需要阻止,那就是你必须给它的东西。

理解这一点的一种方法:从定义它们的地方(词法范围)中阻止捕获状态(变量的值),允许将该状态传递给另一个线程以进行延迟执行。这就是为什么它们不能与函数指针互换;随着一个区块携带更多信息。

答案 2 :(得分:1)

这是一个明智的问题,只是为已经给出的答案添加一点。

如果你看一下直接接受另一个方法作为参数的方法,你会注意到它还需要一个额外的参数, object 来调用该方法。查看您的块示例,您将看到它引用self,因此您的块提供相同的值对 - 方法和对象。

Objective-C绝对没有理由不能拥有一个带有对象和方法的构造,比如@block(object, method),或者更简单地只是object.method,并返回一个块,但它没有有。如果您熟悉C#,您会知道它确实有这样的构造来生成委托,这是它的块版本。