目标c:将方法调用隐式委托给另一个实例

时间:2016-10-12 15:35:01

标签: ios objective-c

我有一个带有委托的类,当然在某个时间点调用委托方法,在本例中为NSURLConnection

NSURLConnection *theConnection = [[NSURLConnection alloc]
                                   initWithRequest:request
                                   delegate:delegate];

我想拦截 委托didFailWithError方法,即NSURLConnection实例不会直接调用委托的方法而是调用不同的方法方法,最终调用didFailWithError

我想做的事情就像"继承"在对象而不是类级别。例如在javascript中,我会做类似的事情:

// Set the original delegate as prototype
var myDecoratedDelegate = Object.create(delegate);
// save the original method
var didFailWithError = delegate.didFailWithError;
// Decorate the didFailWithError method
myDecoratedDelegate.didFailWithError = function() {
    // do something
    didFailWithError()
}
var connection = new Connection(request, myDecoratedDelegate);

通过这种方式,我会归档原始委托的每个方法都被正常调用,除了我想要装饰的函数。

我知道,目标c不是javascript,但我对目标c很新,并且可能有一个优雅的解决方案。

但是,我知道使用method_setImplementation可以更改实例方法的实现。但是,如果我改变一个类的原始行为并且不愿意这样做,我认为对被调用者来说会相当令人惊讶。

对我来说,一个可接受的解决方案也是继承NSURLConnection类并改变它调用其委托的方式。但是,我不知道该怎么做,因为这不是NSURLConnection类的公共API的一部分。

0 个答案:

没有答案