私はパートタイムのメモ帳 Web サイト コーダーで、IOS アプリにステップを踏んでいます。私は先週、初めての Mac を手に入れ、半分しか機能しないアプリをまとめました。今、このSOの答えに納得して、MVCの学習を再開しています。私は非常に急な学習曲線を描いているので、ご容赦ください。
私はMVC、レイヤーの分離、3つのボックスといくつかの矢印について読みました。ただし、理論を現実の世界に翻訳するのはイライラします。私が見たほとんどのサンプル アプリは、MVC を使用していないようです。このApple のLazyTableImages の例app delegate
でさえ、私を混乱させるモデルとして使用しているようです。私はこの非常に単純な MVC の例に基づいて構築しました。
私のアプリは、Web サービスから位置マーカーを取得します。ARC を使用したタブ付きアプリケーションがあります。1 つのタブには、マーカーを表示する Mapkit マップがあります。
マーカー レコードを保持する単純なクラス:
@interface MarkerRecord : NSObject
@property (strong, nonatomic) NSDecimalNumber *lat;
@property (strong, nonatomic) NSDecimalNumber *lon;
@property (strong, nonatomic) NSString *des;
両方のビューを提供する、Marker クラスのコレクションを保持する Model クラス。これは私のモデルクラスです.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 メソッドは静的であるべきですか?
これが明確で受け入れられる質問であることを願っています。お待ちいただきありがとうございます、ポリー。