2012-08-02 9 views
5

मैं आईओएस ऐप्स में कदम उठाने वाली पार्ट-टाइम नोटपैड वेबसाइट कोडर हूं। मुझे पिछले हफ्ते मेरा पहला मैक मिला और मैंने आधे काम करने वाले ऐप को एक साथ जोड़ दिया। अब, SO answer द्वारा आश्वस्त, मैं एमवीसी सीखने की कोशिश कर रहा हूं। मैं बहुत सी सीखने की वक्र पर हूं इसलिए कृपया मेरे साथ भालू।एक्सकोड - क्या यह एमवीसी है?

मैंने एमवीसी, परतों को अलग करने, तीन बक्से और कुछ तीरों पर पढ़ा है, मुझे यह मिल गया है। हालांकि, वास्तविक दुनिया में सिद्धांत का अनुवाद निराशाजनक है। मैंने देखा है कि अधिकांश उदाहरण ऐप्स एमवीसी का उपयोग नहीं करते हैं। ऐप्पल से यह LazyTableImages example भी इस मॉडल के रूप में app delegate का उपयोग करता है जो मुझे भ्रमित करता है। मैंने इस उत्कृष्ट simple MVC example पर बनाया है।

मेरा ऐप वेब सेवा से स्थान मार्कर पुनर्प्राप्त करता है। मेरे पास एआरसी का उपयोग करके एक टैबड एप्लीकेशन है। मार्करों को प्रदर्शित करने के लिए एक टैब में मैपकिट मानचित्र होता है।

एक साधारण वर्ग एक मार्कर रिकॉर्ड धारण करने के लिए:

@interface MarkerRecord : NSObject 

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

एक मॉडल वर्ग, मार्कर वर्गों का एक संग्रह पकड़े, दोनों विचारों की सेवा के लिए।

@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 वर्ग ज:

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

मेरा मुख्य प्रश्न यहां है:

  • क्या मेरा कोड एक सभ्य एमवीसी कार्यान्वयन (शुरुआत) की उपरोक्त रूपरेखा है?

यदि ऐसा है तो:

  • कैसे मैं नियंत्रक अद्यतन करने के लिए मॉडल मिलता है (अर्थात मैं कैसे MarkersModel.objectLoader समारोह mapViewController.putMarkersOnMap कॉल करने के लिए मिलता है)?

मुझे दृढ़ता से संदेह है कि उत्तर नियंत्रक पर एक कस्टम प्रतिनिधि है लेकिन मैं अपने जीवन के लिए यह नहीं देख सकता कि इसे कैसे कार्यान्वित किया जाए। मैं अपनी स्थिति में किसी भी उदाहरण से संबंधित नहीं हो सकता। मुझे लगता है कि मैं नियंत्रक पर कुछ इस तरह की जरूरत है:

@class MapViewController; 
@protocol MapViewControllerDelegate; 

मैं कुछ अतिरिक्त प्रश्न यह पर हूँ जबकि:

  • मैं किसी भी झूलने संकेत आएगी - मुझे लगता है कुछ unsafe_unretained होना चाहिए (मैं संकलन कर रहा हूँ 4.3 तक)?
  • क्या मेरे मार्कर नियंत्रक वर्ग में मॉडल घोषणा सही है? मुझे चिंता है कि यह एआरसी द्वारा प्रबंधित नहीं किया जाएगा। मुझे यह भी संदेह है कि यह सार्वजनिक है लेकिन निजी होना चाहिए।
  • क्या मार्करमोडेल.getमार्कर विधि स्थिर होनी चाहिए?

मुझे आशा है कि यह स्पष्ट और स्वीकार्य प्रश्न है।आपके धैर्य के लिए धन्यवाद, पोली।

उत्तर

5

क्या मेरा कोड एक सभ्य एमवीसी कार्यान्वयन (शुरुआत) की उपरोक्त रूपरेखा है?

मेरी मानकों के अनुसार, हाँ

कैसे मैं मॉडल नियंत्रक

आप सही हैं, आप एक प्रतिनिधि का उपयोग करना चाहते अद्यतन करने के लिए मिलता है। आप प्रतिनिधि के प्रोटोकॉल को कक्षा के साथ घोषित करते हैं, यह एक प्रतिनिधि है। तो अपने MarkersModel हैडर पर विस्तार:

@interface MapViewController : UIViewController<MKMapViewDelegate, MarkersModelDelegate> { 
फिर मॉडल कार्यान्वयन में

:

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

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

@property(weak,nonatomic) id<MarkersModelDelegate> delegate; 
फिर अपने दृश्य नियंत्रक में

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

मैं किसी भी झूलने संकेत आएगी - मैं संदेह है कि कुछ असुरक्षित होना चाहिए (मैं 4.3 तक संकलित हूं)?

ऐसा नहीं है कि मैं

से अवगत हूं नियंत्रक कक्षा में मेरी MarkersModel घोषणा सही है? मुझे चिंता है कि यह एआरसी द्वारा प्रबंधित नहीं किया जाएगा। मुझे यह भी संदेह है कि यह सार्वजनिक है लेकिन निजी होना चाहिए।

आप इसे निजी के रूप में पहले से @private हैडर जोड़कर घोषणा कर सकते हैं:

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

MarkersModel.getMarkers विधि स्थिर होना चाहिए?

यदि स्थैतिक द्वारा, आप आवृत्ति-स्तर विधि के बजाय कक्षा-स्तर के रूप में हैं, जो पूरी तरह से आपके कार्यान्वयन पर निर्भर करता है। यदि सभी MarkersModel ऑब्जेक्ट्स को एक ही डेटा को बनाए रखना माना जाता है, तो हाँ इसे कक्षा-स्तर बनाने के लिए समझ में आता है। लेकिन यदि प्रत्येक MarkersModel ऑब्जेक्ट को Markers का अपना सेट बनाए रखना है, तो नहीं, यह एक उदाहरण-स्तर विधि

+1

रहना चाहिए यह अच्छा है; प्रतिनिधियों का उपयोग बहुत आम है। यदि आप मॉडल में बदलावों में दिलचस्पी रखने वाले एक से अधिक नियंत्रकों के लिए कोई संभावित क्षमता रखते हैं तो एक विकल्प जिसे आप मूल्यांकन करना चाहते हैं, वह "कुंजी-मूल्य निरीक्षण" है। http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueObserving/KeyValueObserving.html –

+0

@PhillipMills सहायक लिंक, मैं वास्तव में हाल ही में वास्तव में सुधार करने के तरीके के बारे में बताता हूं मेरे एमवीसी प्रोग्रामिंग, यह वास्तव में मुझे –

+0

महान जानकारी में मदद करनी चाहिए। बहुत बहुत धन्यवाद। – Polly

संबंधित मुद्दे