NSProxy类有用的实例和原因?

Llu*_*uís 10 proxy cocoa objective-c nsproxy ios

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

ilj*_*ing 8

示例A:想象一下,您将编写一个对象持久层(如CoreData,但当然要好得多;)).

假设您只需查看索引树即可快速完成数据库中数千个项目的查询,而无需阅读和初始化完整项目的成本.您可以使用NSProxy实现延迟加载.使用索引表来查找对象的主键,但不是创建该对象,而是返回知道真实对象主键的NSProxy.

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

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


Iva*_*nko 6

当需要委托侦听时,NSProxy非常有用,例如,您的应用中有一些样式化的UISearchBar,当用户开始键入时,其中删除了搜索图标,这意味着您需要侦听UISearchBarDelegate方法,-searchBar:textDidChange:但此方法已被侦听。 ViewController执行搜索,以避免代码重复,您不想在每个ViewController中复制粘贴隐藏图标逻辑。要解决此问题,您可以创建NSProxy将ViewController引用为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;
} 
Run Code Online (Sandbox Code Playgroud)

并将您的代理实例设置为searchBar委托: searchBar.delegate = proxy