Odpowiedziałem na dość podobne pytanie kilka tygodni temu. Odpowiedz poniżej, edytuj dla tego pytania.
Generalnie unikam tego rodzaju pracy pod numerem NSInvocation
. Zwykle jest to ból głowy związany z utrzymaniem, aw szczególności stwarza trudności w refaktoryzacji w przyszłości.
Po pierwsze, biorąc pod uwagę ten sposób:
-(void)plotPoly:(Polygon *)poly WithColor:(UIColor *)color AndFill:(BOOL)filled;
Byłoby ogólnie być zadeklarowane jako:
-(void)plotPoly:(Polygon *)aPoly color:(UIColor *)aColor filled:(BOOL)filledFlag;
Wynika to konwencje nazewnictwa nieco bliżej.
Teraz zrobię to, przechwytując argumenty do prostej klasy, która zapewnia metodę -invoke
.
Coś z interfejsem takich jak to:
PolyPlotter.h:
@interface PolyPlotter : NSObject
{
Polygon *poly;
UIColor *color;
BOOL filled;
}
+ plotterWithPoly: (Polygon *) aPoly color: (UIColor *) aColor filled: (BOOL) filledFlag;
- (void) plot;
@end
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
Użycie jest bardzo proste. Po prostu stwórz instancję PolygonPlotter i powiedz jej, aby wykonał selektor po opóźnieniu lub w wątku głównym, lub cokolwiek innego.
Podejrzewam, że w momencie rysowania może być potrzebny nieco więcej kontekstu? Jeśli tak, można przekazać te informacje jako argument do -plot
przez, powiedzmy, deklarując metody jak:
- (void) plot: (UIView *) aViewToPlotIn;
czy coś takiego.
Tak jak powiedziałem, nieco więcej kodu, ale o wiele bardziej elastycznego i refaktoryzującego niż wzór NSInvocation. Na przykład możesz całkiem łatwo zrobić z PolygonPlotter coś, co można zarchiwizować.
Czy powinniśmy założyć z UIColor, że jesteś na iPhone'ie? – nall
Jestem. Czy to robi różnicę? – willc2
Tak - jeśli byłeś na Snow Leopard, możesz użyć Bloku, aby rozwiązać ten problem. – bbum