2012-04-15 18 views
6

मैं आईओएस विकास के लिए नया हूं, इसलिए मैं कुछ फीडबैक की सराहना करता हूं।मॉडल और नियंत्रक के बीच संचार - आईओएस

मैं अपनी वेब सेवा के लिए आईओएस क्लाइंट बनाने की कोशिश कर रहा हूं। अब तक मैंने यह किया है:

मैं दो विचारों को लागू कर रहा हूं (स्टोरीबोर्ड का उपयोग कर उपयोगिता-आधारित ऐप)। मुख्य दृश्य में, मैं एक टेक्स्ट फ़ील्ड और एक खोज बटन का उपयोग करता हूं, जहां उपयोगकर्ता एक क्वेरी दर्ज कर सकता है और फिर खोज बटन पर क्लिक कर सकता है। एक बार खोज बटन क्लिक हो जाने के बाद, मेरा इरादा टेक्स्ट फ़ील्ड के मान को पढ़ना है, और इसे मेरी वेब सेवा में मेरे सुरक्षित कॉल में उपयोग करना है। मेरी वेब सेवा क्वेरी परिणामों के साथ एक JSON फ़ाइल के साथ वापस जवाब देती है, जिसे मैं पार्स करता हूं और द्वितीयक दृश्य के टेक्स्ट क्षेत्र में दिखाता हूं।

मुझे पता है कि आईओएस में आराम से कॉल कैसे करें और JSON पार्सिंग को कैसे करें और स्क्रीन पर परिणाम प्रदर्शित करने के लिए कैसे करें (कम से कम टेक्स्ट सामग्री, लेकिन यह एक और अलग सवाल है)। लेकिन मेरा इरादा मेरे आवेदन में एमवीसी मूल बातें सीखना और कार्यान्वित करना है।

एमवीसी के अनुसार, नियंत्रक दृश्य को अद्यतन करता है, और मॉडल एक अधिसूचना प्रसारण भेजता है जो नियंत्रक सुन सकता है और पता कर सकता है कि वस्तु में कोई बदलाव है या नहीं। तो यही वह है जो मैं आदर्श रूप से करना चाहता हूं:

मेरा मॉडल - मेरा मॉडल कोर रीस्टफुल कॉल को संभालेगा, JSON उत्तर प्राप्त करेगा, इसे पार्स करेगा और परिणामी मान प्राप्त करेगा जिसे मैं दृश्य पर प्रदर्शित करना चाहता हूं।

मेरा नियंत्रक - मैं अपने नियंत्रक को अपने मॉडल को सुनना चाहता हूं और परिणामस्वरूप मान मॉडल से प्राप्त कर सकता हूं और उन्हें दृश्य पर प्रदर्शित कर सकता हूं।

त्वरित और गंदे तरीके से उपयोग करके, मैं रीस्टफुल कॉल, जेएसओएन पार्सिंग और परिणामी मूल्यों को प्रदर्शित कर सकता हूं - सभी नियंत्रक के अंदर, लेकिन इस तकनीक के साथ, यदि मेरा दृश्य कल बदलता है, तो मुझे अपना कोड दोबारा लिखना होगा । या अगर मैं नई विशेषताएं जोड़ना चाहता हूं, तो मुझे अपना नियंत्रक बदलना होगा। तो आदर्श रूप में मैं एक कोर मॉडल रखना चाहता हूं जो इस बात से अवगत नहीं है कि दृश्य कैसा दिखता है, और बस नियंत्रक मॉडल से परिणाम लेते हैं और उन्हें व्यू पर प्रदर्शित करते हैं।

जो मैंने अभी तक Google खोज परिणामों से पढ़ा है, उससे ऐसा करने के दो तरीके एक हैं) मुख्य मूल्य निरीक्षण और बी) अधिसूचना केंद्र।

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

इसलिए इस बारे में किसी भी मदद की बहुत सराहना की जाएगी।

+1

क्या आप वास्तव में अपने मॉडल को रीस्टफुल सेवा के साथ संचार को संभालना चाहते हैं? – Till

उत्तर

12

मेरे कुछ प्रश्न हैं, क्या मैं स्ट्रिंग परिणाम मूल्य भेज सकता हूं जो मेरे नियंत्रक को अधिसूचना केंद्र का उपयोग कर मूल्य देता है?

हां, यह आमतौर पर NSNotification की संपत्ति का उपयोग करके किया जाएगा। userInfo एक सादा NSDictionary है जिसमें NSObjectNSCopying प्रोटोकॉल (आमतौर परका उपयोग करने वाले कुंजियों द्वारा अनुक्रमित व्युत्पन्न वस्तुओं के उदाहरण शामिल हो सकते हैं)। ध्यान दें कि शब्दकोश (userInfo) आपके पैरामीटर ऑब्जेक्ट को बनाए रखेगा।


कैसे सूचना केंद्र वास्तव में स्ट्रिंग मूल्यों के साथ काम करता है?

अच्छा, यह इस बात पर निर्भर करता है कि आप इसे कैसे काम करना चाहते हैं। लेकिन एक तरफ झुकाव, नीचे देखें।


मैं कुछ अच्छे उदाहरण कहाँ से मिलेगी?

हो सकता है कि यह एक में मदद करता है ...


उदाहरण

रिसीवर (नियंत्रक) अधिसूचना के लिए पंजीकृत करता है:

- (void)registerForNotifications 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(modelObjectUpdatedString:) 
               name:@"StringUpdated" 
               object:nil]; 
} 

इस (मॉडल) अधिसूचित दुनिया:

- (void)stringUpdateWith:(NSString *)theString 
{ 
    self.string = theString; 
    [[[NSNotificationCenter defaultCenter] postNotificationName:@"StringUpdated" 
                 object:self 
                 userInfo:[NSDictionary dictionaryWithObjectsAndKeys:self.string, @"String", nil]]; 
} 

रिसीवर (नियंत्रक) ने अपने हैंडलर के भीतर सूचना प्राप्त होता है:

- (void)modelObjectUpdatedString:(NSNotification *)notification 
{ 
    ModelObject *postingObject = [notification object]; 
    NSString *string = [[notification userInfo] 
     objectForKey:@"String"]; 
    ... 
} 
+2

यह एक सही जवाब है। एक स्पष्ट और संक्षिप्त उत्तर के लिए बहुत बहुत धन्यवाद। यही वह है जिसकी तलाश में मैं हूं। – BlueChips23

4

आप सही मार्ग के किनारे में सोच रहे हैं, लेकिन अभी भी पूरी तरह से नहीं। अपनी टिप्पणी में "बताएं" तक, आपको अपने मॉडल के अंदर रीस्टफुल संचार को संभालना नहीं चाहिए। अगर मैं आप थे, तो मैं जानकारी लाने के लिए जिम्मेदार एक उपयोगिता वर्ग तैयार करूंगा, और फिर डेटा धारण करने के लिए जिम्मेदार वर्ग (यह अंतिम श्रेणी आपका मॉडल है)।

यह एक क्लास विधि बनाने के लिए चालाक होगा जो आपके ऑब्जेक्ट का एक नया उदाहरण आवंटित और आरंभ करता है, जो आपके रीस्टफुल कम्युनिकेटर क्लास के माध्यम से जेएसओएन डेटा से बनाया गया है।

देखने के लिए अपने नियंत्रक बिंदु से:

RESTHelper *rest = [RESTHelper restHelperWithURL:yourRESTURL]; 
YourModel *model = [YourModel modelWithJSON:[rest fetchObjectWithID:1]]; 
// Present your models data in the view. 

आप यहाँ CoreData का उपयोग करने से लाभ हो सकता है, और मैं दृढ़ता से है कि इस पर गौर करने के लिए प्रोत्साहित करते हैं।

+0

यहां अच्छी टिप्स। सही दिशा में मुझे मार्गदर्शन करने के लिए धन्यवाद। ये उन फीडबैक हैं जिन्हें मैं प्राप्त करने की उम्मीद कर रहा था, क्योंकि मैं आईओएस विकास के लिए नया हूं, और मैं किसी जटिल ऐप्स को करने से पहले मूलभूत बातें प्राप्त करना चाहता हूं। – BlueChips23

+0

आपको NSNotificationCenter का उपयोग नहीं करना चाहिए जब तक कि आपके पास ऐसा कोई मामला न हो जहां ब्लॉक, केवीओ या प्रतिनिधिमंडल नौकरी नहीं कर सकता। –

+0

हाय रasmस, मैं आईओएस के साथ पकड़ने के लिए भी मिल रहा हूं। (ओओ के लिए इतना नया नहीं)। तो क्या आप सुझाव देंगे कि शेष हेल्पर क्लास मॉडल पर प्रोटोकॉल पर "वापस कॉल करें", एक बार इसमें कुछ डेटा हो जाए? और क्या आप समझा सकते हैं कि आप [rest fetchObjectWithID: 1] का उपयोग क्यों करते हैं? मुझे पता है कि मैं स्टैनफोर्ड वीडियो में आया था, लेकिन ऐसा लगता है कि मैंने उन मस्तिष्क कोशिकाओं को नष्ट कर दिया है ... – Greycon

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