2012-08-02 9 views
5

Sono un programmatore di siti Web di blocco note part-time che si occupa delle app IOS. Ho ottenuto il mio primo Mac la scorsa settimana e ho messo insieme una mezza app funzionante. Ora, convinto da questo SO answer, sto riavviando cercando di imparare MVC. Sono su una curva di apprendimento molto ripida quindi ti prego di sopportare me.Xcode - È questo MVC?

Ho letto su MVC, separazione di livelli, tre riquadri e alcune frecce, ho capito. Tuttavia, tradurre la teoria nel mondo reale è frustrante. La maggior parte delle app di esempio che ho visto non sembrano utilizzare MVC. Anche questo LazyTableImages example di Apple sembra utilizzare app delegate come il modello che mi confonde. Ho costruito su questo eccellente simple MVC example.

La mia app recupera gli indicatori di posizione da un servizio web. Ho un'applicazione a schede usando ARC. Una scheda ha una mappa Mapkit per visualizzare i marcatori.

Una semplice classe di tenere un record di marcatore:

@interface MarkerRecord : NSObject 

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

modello di una classe, in possesso di un insieme di classi Marker, per servire entrambi i punti di vista. Questa è la mia classe Modello .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 

e l'implementazione:

@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 

} 

Una classe mapViewController .h:

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

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

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

@end 

e l'implementazione:

@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 
    ... 
} 

Ecco la mia domanda principale:

  • È il mio schema di schema sopra (l'inizio di) un'implementazione MVC decente?

Se è così:

  • Come faccio ad avere il modello per aggiornare il controller (vale a dire come faccio ad avere la funzione MarkersModel.objectLoader chiamare mapViewController.putMarkersOnMap)?

Sospetto fortemente che la risposta sia un delegato personalizzato sul controller ma non riesco a vedere come implementarlo. Non posso riferire alcun esempio alla mia situazione. Credo di aver bisogno di qualcosa di simile sul controller:

@class MapViewController; 
@protocol MapViewControllerDelegate; 

Mentre io sono a esso alcune domande supplementari:

  • Avrò creare qualsiasi dangling pointer - Ho il sospetto che qualcosa dovrebbe essere unsafe_unretained (io sono la compilazione a 4.3)?
  • La dichiarazione MarkersModel nella classe controller è corretta? Sono preoccupato che non sarà gestito da ARC. Sospetto anche che sia pubblico ma dovrebbe essere privato.
  • Il metodo MarkersModel.getMarkers deve essere statico?

Spero che questa sia una domanda chiara e accettabile.Grazie per la tua pazienza, Polly.

risposta

5

Il mio codice è delineato sopra (l'inizio di) un'implementazione MVC decente?

A mio parere, sì

Come faccio ad avere il modello per aggiornare il controller

Lei ha ragione, si desidera utilizzare un delegato. Dichiari il protocollo delegato insieme alla classe per cui è un delegato. Quindi, l'espansione sul MarkersModel intestazione:

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

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

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

Poi, nel tuo controller di vista:

@interface MapViewController : UIViewController<MKMapViewDelegate, MarkersModelDelegate> { 

Poi nella realizzazione del modello:

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

Avrò creare tutti i puntatori penzolanti - I sospetto che qualcosa dovrebbe essere non sicuro_unretained (sto compilando a 4.3)?

Non che io sono a conoscenza di

è la mia dichiarazione MarkersModel nella classe controller corretto? Sono preoccupato che non sarà gestito da ARC. Sospetto anche che sia pubblico ma dovrebbe essere privato.

si può dichiarare come private aggiungendo l'header @private anticipo:

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

caso in cui il metodo di MarkersModel.getMarkers essere statica?

Se per statico si intende un livello di classe anziché un metodo a livello di istanza, tutto dipende dall'implementazione. Se tutti gli oggetti MarkersModel devono conservare gli stessi dati, allora sì, ha senso farlo diventare di classe. Ma se ogni oggetto MarkersModel deve conservare il proprio insieme di Markers quindi no, deve rimanere un metodo a livello di istanza

+1

Questo è buono; l'uso dei delegati è molto comune. Un'alternativa che potresti voler valutare è "Osservazione valore-chiave" se hai la possibilità che più di un controller sia interessato alle modifiche al modello. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html –

+0

@PhillipMills Link utile, in realtà mi sono appena imbattuto in realtà nel nocciolo di come migliorare la mia programmazione MVC, questo dovrebbe davvero aiutarmi –

+0

Grandi informazioni. Grazie mille. – Polly

Problemi correlati