首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSProxy类有用的真实例子,为什么?

NSProxy类有用的真实例子,为什么?
EN

Stack Overflow用户
提问于 2012-12-24 20:16:13
回答 2查看 4.5K关注 0票数 16

我一直在想为什么NSProxy类如此重要。为什么一个对象需要将它的实例变量保存在其他对象中?我需要一些例子来理解何时使用它。谢谢!

EN

回答 2

Stack Overflow用户

发布于 2018-08-23 15:13:42

当需要代理拦截时,NSProxy很有用,假设你的应用中有一些样式的UISearchBar,当用户开始输入时,你会移除搜索图标,这意味着你需要侦听UISearchBarDelegate方法-searchBar:textDidChange:,但这个方法已经被执行搜索的ViewController侦听了,以避免代码重复,你不想在每个ViewController中复制粘贴隐藏图标逻辑。要解决这个问题,您可以创建引用您的ViewController的NSProxy作为originalDelegate,将隐藏的搜索图标帮助器创建为middleMan,然后在您的NSProxy实例中实现以下方法:

代码语言:javascript
复制
- (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

票数 11
EN

Stack Overflow用户

发布于 2015-02-03 07:14:17

示例A:假设你正在编写一个对象持久层(就像CoreData,但当然要好得多)。

假设您只需查看索引树,就可以非常快速地完成对数据库中数千个项目的查询,而无需读取和初始化整个项目。您可以使用NSProxy来实现延迟加载。使用索引表定位对象的主键,但不是创建该对象,而是返回一个知道实际对象的主键的NSProxy。

仅当需要另一个数据库查找时,代理对象才会创建该项,并将所有将来的消息重定向到该项。调用代码将只处理NSProxy项,而不是在引擎盖下执行延迟加载。

示例B(这是OS X,抱歉):当大纲层次结构中有两次相同的项目时,NSOutlineView的行为非常奇怪。当你的应用程序中有一个智能组功能时,这是一个非常常见的问题。解决方案:在大纲视图中使用不同的代理,指向相同的对象。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14021281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档