我有一个带有委托的类,当然在某个时间点调用委托方法,在本例中为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的一部分。