2012-06-12 30 views
3

我有一个适用于我的桌面应用程序的插件体系结构。我使用Apple's code loading guide以相当标准的方式实现了它。可可插件模式

我有一个单独的协议,其定义了所有的插件的一个实例可以或应该响应的方法。

唯一的问题是这种协议定义了大约80的方法。这些方法中只有大约10种是强制性的,其余的都是可选的。一些插件将实现所有80个方法,而其他插件将只实现基本10.其他插件仅实现基本10.通过Info.plist文件中的NSPrincipalClass键,插件束通常会告知其主机应用程序实例化哪个类。这是一个单一的键,所以只有一个类可以被实例化。

插件协议是一个单一的文件和其期望其将通过此单一类使用。

我的问题是:将单个协议内部的功能拆分为多个协议的最佳方式是什么,同时允许插件编写器具有更灵活的实现?

目前我现有的插件在其主类中的以下内容:

- (BOOL)respondsToSelector:(SEL)selector { 
    return [self forwardingTargetForSelector:selector] ? YES : NO; 
} 

- (id)forwardingTargetForSelector:(SEL)selector { 
    id target = nil; 
    if ([self.instanceOne respondsToSelector:selector]) { 
     target = self.instanceOne; 
    } else if ([self.instanceTwo respondsToSelector:selector]) { 
     target = self.instanceTwo; 
    } else if ([self.instanceThree respondsToSelector:selector]) { 
     target = self.instanceThree; 
    } 

    return target; 
} 

但是,而不是强加它在插件作家像这样定义一个特设系统,我想应用程序的插件框架,以适应更灵活的解决方案。

回答

1

如果您可以将80种方法划分为合理的功能块,可以将它们分成若干协议(FooProtcol,BarProtocol等),并定义可选属性,以返回对在主协议中实现它们的对象的引用。例如:

@protocol PluginPrimaryProtocol <NSObject> 
@required 
/* ... */ 
@optional 
@property (readonly) id<FooProtocol> fooDelegate; 
@property (readonly) id<BarProtocol> barDelegate; 
/* ... */ 
@end