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.
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 –
@PhillipMills Link utile, in realtà mi sono appena imbattuto in realtà nel nocciolo di come migliorare la mia programmazione MVC, questo dovrebbe davvero aiutarmi –
Grandi informazioni. Grazie mille. – Polly