在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)
];
或者其他一些。
答案 0 :(得分:1)
不。如果该方法将块作为其处理程序,则需要为其提供一个块。为什么呢?
有一些方法可以使用函数指针而不是块,比如NSArray的-sortedArrayUsingFunction:context:
(而不是基于块的-sortedArrayUsingComparator:
),但你绝对不能只交换方法签名它需要一个区块。
答案 1 :(得分:1)
总之,没有。
如果该方法需要阻止,那就是你必须给它的东西。
理解这一点的一种方法:从定义它们的地方(词法范围)中阻止捕获状态(变量的值),允许将该状态传递给另一个线程以进行延迟执行。这就是为什么它们不能与函数指针互换;随着一个区块携带更多信息。
答案 2 :(得分:1)
这是一个明智的问题,只是为已经给出的答案添加一点。
如果你看一下直接接受另一个方法作为参数的方法,你会注意到它还需要一个额外的参数, object 来调用该方法。查看您的块示例,您将看到它引用self
,因此您的块提供相同的值对 - 方法和对象。
Objective-C绝对没有理由不能拥有一个带有对象和方法的构造,比如@block(object, method)
,或者更简单地只是object.method
,并返回一个块,但它没有有。如果您熟悉C#,您会知道它确实有这样的构造来生成委托,这是它的块版本。