wil*_*lc2 5 cocoa cocoa-touch objective-c
假设我有一个带有此签名的方法:
-(void)plotPoly:(Polygon *)poly WithColor:(UIColor *)color AndFill:(BOOL)filled;
Run Code Online (Sandbox Code Playgroud)
如何在那里获得UIColor和BOOL以及Polygon?
我应该将它们包装在NSArray中并将它们拉出被调用的方法吗?这意味着我必须改变方法sig,对吧?
有更优雅的方式吗?
仍然不完全是我所说的优雅,但比不得不改变整个API更糟糕的是NSInvocation:
Polygon *poly;
UIColor *color;
BOOL filled;
// Assume the above variables exist
NSInvocation *inv = [NSInvocation invocationWithMessageSignature:[target messageSignatureForSelector:message]];
[inv setArgument:&poly atIndex:2];
[inv setArgument:&color atIndex:3];
[inv setArgument:&filled atIndex:4];
[inv performSelector:@selector(invokeWithTarget:) withObject:target afterDelay:1];
Run Code Online (Sandbox Code Playgroud)
另一个最佳选择是创建一个包装器方法,该方法使用适当的参数调用所需的原始方法(可能以字典或数组形式提供),该方法与延迟后执行的签名相匹配.
几个星期前我回答了一个相当类似的问题.针对此问题编辑以下答案.
一般来说,我避免NSInvocation这种工作.它往往是一种维护问题,特别是在未来的重构中会造成困难.
首先,给出这种方法:
-(void)plotPoly:(Polygon *)poly WithColor:(UIColor *)color AndFill:(BOOL)filled;
Run Code Online (Sandbox Code Playgroud)
它通常被声明为:
-(void)plotPoly:(Polygon *)aPoly color:(UIColor *)aColor filled:(BOOL)filledFlag;
Run Code Online (Sandbox Code Playgroud)
这更符合命名约定.
现在,我要做的是将参数捕获到一个提供-invoke方法的简单类中.
像这样的界面的东西:
PolyPlotter.h:
@interface PolyPlotter : NSObject
{
Polygon *poly;
UIColor *color;
BOOL filled;
}
+ plotterWithPoly: (Polygon *) aPoly color: (UIColor *) aColor filled: (BOOL) filledFlag;
- (void) plot;
@end
Run Code Online (Sandbox Code Playgroud)
PolyPlotter.m:
@interface PolyPlotter()
@property Polygon *poly;
@property UIColor *color;
@property BOOL filled;
@end
@implementation PolyPlotter
@synthesize poly, color, filled;
+ plotterWithPoly: (Polygon *) aPoly color: (UIColor *) aColor filled: (BOOL) filledFlag;
{
PolyPlotter *polygonPlotter = [PolyPlotter new];
polygonPlotter.poly = aPoly;
polygonPlotter.color = aColor;
polygonPlotter.filled = filledFlag;
return [polygonPlotter autorelease];
}
- (void) plot;
{
// ... do your plotting here ...
}
@end
Run Code Online (Sandbox Code Playgroud)
用法很简单.只需创建一个PolygonPlotter实例,并告诉它plot在延迟或主线程或其他任何东西后执行选择器.
鉴于这个问题,我怀疑在绘图时你可能需要更多的背景?如果是这样,您可以将该信息作为参数传递给-plot,例如,将该方法声明为:
- (void) plot: (UIView *) aViewToPlotIn;
Run Code Online (Sandbox Code Playgroud)
或类似的东西.
就像我说的,稍微多一些代码,但比NSInvocation模式更灵活和可重构.例如,您可以非常轻松地将PolygonPlotter设置为可归档的内容.
| 归档时间: |
|
| 查看次数: |
4230 次 |
| 最近记录: |