2012-08-02 48 views
5

Tôi là người lập trình trang web notepad bán thời gian thực hiện các bước vào ứng dụng iOS. Tôi đã nhận được mac đầu tiên của tôi tuần trước và đã cobbled cùng một ứng dụng làm việc một nửa. Bây giờ, bị thuyết phục bởi điều này SO answer, tôi đang khởi động lại cố gắng tìm hiểu MVC. Tôi đang trên một đường cong học tập rất dốc nên hãy chịu với tôi.Xcode - Đây có phải là MVC không?

Tôi đã đọc trên MVC, tách lớp, ba hộp và một số mũi tên, tôi nhận được nó. Tuy nhiên, dịch lý thuyết vào thế giới thực là bực bội. Hầu hết các ứng dụng ví dụ tôi đã xem xét dường như không sử dụng MVC. Ngay cả điều này LazyTableImages example từ Apple dường như sử dụng app delegate làm mô hình gây nhầm lẫn cho tôi. Tôi đã xây dựng trên điều này xuất sắc simple MVC example.

Ứng dụng của tôi truy lục các điểm đánh dấu vị trí từ một dịch vụ web. Tôi có một ứng dụng theo thẻ bằng cách sử dụng ARC. Một tab có bản đồ Mapkit để hiển thị các điểm đánh dấu.

Một lớp đơn giản để giữ một kỷ lục đánh dấu:

@interface MarkerRecord : NSObject 

@property (strong, nonatomic) NSDecimalNumber *lat; 
@property (strong, nonatomic) NSDecimalNumber *lon; 
@property (strong, nonatomic) NSString *des; 

Một lớp Model, giữ một bộ sưu tập của các lớp học Marker, để phục vụ cả hai quan điểm. Đây là lớp học mẫu của tôi .h:

@interface MarkersModel : NSObject 

- (void)getMarkers; // Send HTTP GET to web service to retrieve JSON markers 
- (void)postMarker; // Send HTTP POST to web service to INSERT new marker record 

Và việc thực hiện:

@interface MarkersModel() 
@property (strong, nonatomic) NSArray *data; 
@end 

@implementation MarkersModel 
@synthesize data; 

- (void)getMarkers 
{ 
    // Send HTTP GET to web service to retrieve JSON markers 
    ... 
} 

- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects 
{ 
    // Thanks to Restkit data is an array of Marker classes 
    data = objects; 

    // Pass data to controller 

} 

Một lớp mapViewController .h:

#import <MapKit/MapKit.h> 
#import "MarkersModel.h" 

@interface MapViewController : UIViewController<MKMapViewDelegate> { 
    MarkersModel *markersModel; 
} 

@property (nonatomic, strong) IBOutlet MKMapView *mapView; 

@end 

Và việc thực hiện:

@interface MapViewController() 
@end 

@implementation MapViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Create instance of markers model 
    markersModel = [[MarkersModel alloc] init]; 
} 

-(void)viewWillAppear:(BOOL)animated 
{ 
    [markersModel getMarkers]; 
} 

- (void)putMarkersOnMap 
{ 
    // To be called by Markers Model 
    ... 
} 

Đây là câu hỏi chính của tôi:

  • Mã của tôi có phác thảo ở trên (khởi đầu) một triển khai MVC hợp lý không?

Nếu vậy:

  • làm thế nào để tôi nhận được mẫu để cập nhật Controller (ví dụ: làm thế nào để tôi nhận được chức năng MarkersModel.objectLoader gọi mapViewController.putMarkersOnMap)?

Tôi nghi ngờ câu trả lời là đại biểu tùy chỉnh trên bộ điều khiển nhưng tôi không thể cho cuộc sống của tôi xem cách triển khai nó. Tôi không thể liên hệ bất kỳ ví dụ nào cho tình huống của tôi. Tôi nghĩ rằng tôi cần một cái gì đó như thế này trên bộ điều khiển:

@class MapViewController; 
@protocol MapViewControllerDelegate; 

Trong khi tôi đang ở đó một số câu hỏi thêm:

  • tôi sẽ tạo ra bất kỳ con trỏ tòn ten - Tôi nghi ngờ điều gì đó nên unsafe_unretained (Tôi đang biên soạn đến 4.3)?
  • Khai báo MarkersModel của tôi trong lớp điều khiển có chính xác không? Tôi lo ngại rằng nó sẽ không được quản lý bởi ARC. Tôi cũng nghi ngờ nó là công khai nhưng phải riêng tư.
  • Phương pháp MarkersModel.getMarkers có tĩnh không?

Tôi hy vọng điều này là rõ ràng và có thể chấp nhận được.Cảm ơn sự kiên nhẫn của bạn, Polly.

Trả lời

5

Mã của tôi có phác thảo ở trên (khởi đầu) một triển khai MVC hợp lý không?

Theo các tiêu chuẩn của tôi, vâng

làm thế nào để tôi nhận được mẫu để cập nhật Controller

Bạn là chính xác, bạn muốn sử dụng một đại biểu. Bạn khai báo giao thức ủy nhiệm cùng với lớp đó là một ủy nhiệm cho. Vì vậy, mở rộng trên MarkersModel tiêu đề của bạn:

@protocol MarkersModelDelegate<NSObject> 
-(void) markersDidUpdate:(MarkersModel*)model; 
@end 

@interface MarkersModel : NSObject 
{ 
    __weak id<MarkersModelDelegate> delegate; 
} 

@property(weak,nonatomic) id<MarkersModelDelegate> delegate; 

Sau đó, trong bộ điều khiển xem của bạn:

@interface MapViewController : UIViewController<MKMapViewDelegate, MarkersModelDelegate> { 

Sau đó, trong việc thực hiện mô hình:

@implementation MarkersModel 

@synthesize delegate; 

//... 

-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects 
{ 
    // Thanks to Restkit data is an array of Marker classes 
    data = objects; 

    // Pass data to controller 
    if(delegate != nil) 
    { 
     [delegate markersDidUpdate:self]; 
    } 
} 

tôi sẽ tạo ra bất kỳ con trỏ tòn ten - Tôi nghi ngờ một cái gì đó nên được unsafe_unretained (tôi đang biên dịch để 4.3)?

Không phải là tôi biết

là khai MarkersModel của tôi trong lớp điều khiển có đúng không? Tôi lo ngại rằng nó sẽ không được quản lý bởi ARC. Tôi cũng nghi ngờ nó là công khai nhưng phải riêng tư.

Bạn có thể khai báo nó như tư nhân bằng cách thêm tiêu đề @private trước:

@interface MapViewController... 
{ 
@private 
MarkersModel *markersModel; 
... 

phương pháp MarkersModel.getMarkers Nên tĩnh?

Nếu theo tĩnh, bạn ngụ ý là cấp lớp thay vì phương pháp cấp độ thể hiện, hoàn toàn phụ thuộc vào việc triển khai của bạn. Nếu tất cả các đối tượng MarkersModel có nghĩa vụ giữ lại cùng một dữ liệu, thì có nghĩa là làm cho nó trở thành cấp lớp. Nhưng nếu mỗi đối tượng MarkersModel được yêu cầu phải giữ lại bộ riêng của mình là Markers thì không, nó sẽ vẫn là một phương thức cấp cá thể

+1

Điều này là tốt; sử dụng các đại biểu là rất phổ biến. Một thay thế bạn có thể muốn cũng đánh giá là "Quan sát giá trị quan trọng" nếu bạn có bất kỳ tiềm năng nào cho nhiều bộ điều khiển đang quan tâm đến những thay đổi đối với mô hình. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html –

+0

@PhillipMills Liên kết hữu ích, tôi gần đây đã thực sự nhận được sự thật về cách cải thiện lập trình MVC của tôi, điều này thực sự sẽ giúp tôi ra –

+0

Thông tin tuyệt vời. Cảm ơn rất nhiều. – Polly

Các vấn đề liên quan