Tôi đã trả lời câu hỏi tương tự cách đây vài tuần. Trả lời dưới đây đã chỉnh sửa cho câu hỏi này.
Nói chung, tôi tránh NSInvocation
cho loại công việc này. Nó có xu hướng là một nhức đầu bảo trì và, đặc biệt, tạo ra khó khăn trong tái cấu trúc trong tương lai.
Đầu tiên, được đưa ra phương pháp này:
-(void)plotPoly:(Polygon *)poly WithColor:(UIColor *)color AndFill:(BOOL)filled;
Nó sẽ thường được khai báo là:
-(void)plotPoly:(Polygon *)aPoly color:(UIColor *)aColor filled:(BOOL)filledFlag;
này theo quy ước đặt tên một chút chặt chẽ hơn.
Bây giờ, những gì tôi sẽ làm là thực sự nắm bắt các đối số thành một lớp đơn giản cung cấp phương thức -invoke
.
Something với một giao diện như thế này:
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
Cách sử dụng rất đơn giản. Chỉ cần tạo một thể hiện của PolygonPlotter và yêu cầu nó thực hiện bộ chọn plot
sau khi trì hoãn hoặc trên sợi chính hoặc bất kỳ thứ gì.
Với câu hỏi, tôi nghi ngờ rằng bạn có thể cần thêm một chút ngữ cảnh tại thời điểm vẽ? Nếu vậy, bạn có thể chuyển thông tin đó như là một cuộc tranh cãi để -plot
bởi, nói, tuyên bố phương pháp như:
- (void) plot: (UIView *) aViewToPlotIn;
Hoặc một cái gì đó như thế.
Như tôi đã nói, mã hơi hơn, nhưng linh hoạt hơn và có thể tái cấu trúc hơn so với mẫu NSInvocation. Ví dụ, bạn có thể dễ dàng làm cho một cái gì đó PolygonPlotter có thể được lưu trữ.
Chúng ta có nên giả định từ UIColor rằng bạn đang sử dụng iPhone không? – nall
Tôi. Điều đó làm cho một sự khác biệt? – willc2
Có - nếu bạn đang sử dụng Snow Leopard, bạn có thể sử dụng một khối để giải quyết vấn đề này. – bbum