我是一名兼职记事本网站编码员,正在逐步进入 IOS 应用程序。上周我得到了我的第一台 Mac,并拼凑了一个可以正常工作的应用程序。现在,被这个SO 答案说服了,我重新开始尝试学习 MVC。我的学习曲线非常陡峭,所以请多多包涵。
我已经阅读了 MVC、层分离、三个框和一些箭头,我明白了。然而,将理论转化为现实世界是令人沮丧的。我看过的大多数示例应用程序似乎都没有使用 MVC。甚至这个来自 Apple 的LazyTableImages 示例似乎也被app delegate
用作让我感到困惑的模型。我建立在这个非常简单的 MVC 示例之上。
我的应用程序从 Web 服务中检索位置标记。我有一个使用 ARC 的选项卡式应用程序。一个选项卡有一个 Mapkit 地图来显示标记。
保存标记记录的简单类:
@interface MarkerRecord : NSObject
@property (strong, nonatomic) NSDecimalNumber *lat;
@property (strong, nonatomic) NSDecimalNumber *lon;
@property (strong, nonatomic) NSString *des;
一个模型类,持有标记类的集合,为两个视图提供服务。这是我的模型类.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
和实施:
@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
}
mapViewController 类 .h:
#import <MapKit/MapKit.h>
#import "MarkersModel.h"
@interface MapViewController : UIViewController<MKMapViewDelegate> {
MarkersModel *markersModel;
}
@property (nonatomic, strong) IBOutlet MKMapView *mapView;
@end
和实施:
@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
...
}
这是我的主要问题:
- 我上面的代码大纲(开始)是一个体面的 MVC 实现吗?
如果是这样的话:
- 如何让模型更新控制器(即如何让 MarkersModel.objectLoader 函数调用 mapViewController.putMarkersOnMap)?
我强烈怀疑答案是控制器上的自定义委托,但我无法终生了解如何实现它。我无法将任何例子与我的情况联系起来。我想我在控制器上需要这样的东西:
@class MapViewController;
@protocol MapViewControllerDelegate;
虽然我在做一些额外的问题:
- 我会创建任何悬空指针 - 我怀疑应该是什么
unsafe_unretained
(我正在编译到 4.3)? - 我在控制器类中的 MarkersModel 声明是否正确?我担心它不会由 ARC 管理。我也怀疑它是公开的,但应该是私有的。
- MarkersModel.getMarkers 方法应该是静态的吗?
我希望这是一个明确且可以接受的问题。谢谢你的耐心,波莉。