5

私はパートタイムのメモ帳 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 メソッドは静的であるべきですか?

これが明確で受け入れられる質問であることを願っています。お待ちいただきありがとうございます、ポリー。

4

1 に答える 1

5

上記のコードの概要 (の始まり) は適切な MVC 実装ですか?

私の基準では、はい

モデルを取得してコントローラーを更新するにはどうすればよいですか

あなたは正しいです、あなたはデリゲートを使いたいです。デリゲート プロトコルは、デリゲートであるクラスと共に宣言します。MarkersModelしたがって、ヘッダーを拡張します。

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

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

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

次に、View Controller で次のようにします。

@interface MapViewController : UIViewController<MKMapViewDelegate, MarkersModelDelegate> {

次に、モデルの実装で:

@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];
    }
}

ダングリング ポインターを作成する予定はありますか?

私が知っているわけではありません

コントローラー クラスの MarkersModel 宣言は正しいですか? ARCで管理されないのではないかと心配です。また、それは公開されていると思いますが、非公開にする必要があります。

@private事前にヘッダーを追加することで、プライベートとして宣言できます。

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

MarkersModel.getMarkers メソッドは静的であるべきですか?

静的である場合、インスタンスレベルのメソッドではなくクラスレベルのメソッドを意味し、それは完全に実装に依存します。すべてのMarkersModelオブジェクトが同じデータを保持することになっている場合、はい、それをクラスレベルにすることは理にかなっています。ただし、各MarkersModelオブジェクトが独自のセットを保持するMarkers必要がある場合は、インスタンスレベルのメソッドのままにする必要があります

于 2012-08-02T20:40:39.823 に答える