我一直在想为什么NSProxy类如此重要。为什么一个对象需要将它的实例变量保存在其他对象中?我需要一些例子来理解何时使用它。谢谢!
发布于 2018-08-23 15:13:42
当需要代理拦截时,NSProxy很有用,假设你的应用中有一些样式的UISearchBar,当用户开始输入时,你会移除搜索图标,这意味着你需要侦听UISearchBarDelegate方法-searchBar:textDidChange:,但这个方法已经被执行搜索的ViewController侦听了,以避免代码重复,你不想在每个ViewController中复制粘贴隐藏图标逻辑。要解决这个问题,您可以创建引用您的ViewController的NSProxy作为originalDelegate,将隐藏的搜索图标帮助器创建为middleMan,然后在您的NSProxy实例中实现以下方法:
- (void)forwardInvocation:(NSInvocation *)invocation
{
if ([self.middleMan respondsToSelector:invocation.selector])
{
//Note: probably it's better to provide a copy invocation
[invocation invokeWithTarget:self.middleMan];
}
if ([self.originalDelegate respondsToSelector:invocation.selector])
{
[invocation invokeWithTarget:self.originalDelegate];
}
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
id result = [self.originalDelegate methodSignatureForSelector:sel];
if (!result) {
result = [self.middleMan methodSignatureForSelector:sel];
}
return result;
} 并将代理实例设置为searchBar委托:searchBar.delegate = proxy
发布于 2015-02-03 07:14:17
示例A:假设你正在编写一个对象持久层(就像CoreData,但当然要好得多)。
假设您只需查看索引树,就可以非常快速地完成对数据库中数千个项目的查询,而无需读取和初始化整个项目。您可以使用NSProxy来实现延迟加载。使用索引表定位对象的主键,但不是创建该对象,而是返回一个知道实际对象的主键的NSProxy。
仅当需要另一个数据库查找时,代理对象才会创建该项,并将所有将来的消息重定向到该项。调用代码将只处理NSProxy项,而不是在引擎盖下执行延迟加载。
示例B(这是OS X,抱歉):当大纲层次结构中有两次相同的项目时,NSOutlineView的行为非常奇怪。当你的应用程序中有一个智能组功能时,这是一个非常常见的问题。解决方案:在大纲视图中使用不同的代理,指向相同的对象。
https://stackoverflow.com/questions/14021281
复制相似问题