2010-09-21 17 views
8

प्राप्त करने के बारे में मैं कोर डेटा गाइड देखता हूं, और एक नया NSManagedObject उदाहरण प्राप्त करने के दो तरीके हैं।एक नया NSManagedObject ऑब्जेक्ट

  • - initWithEntity: insertIntoManagedObjectContext: NSManagedObject वर्ग के
  • + insertnewObjectForEntityForName: inManagedObjectContext: NSEntityDescription वर्ग के

वहाँ दोनों तरीकों के बीच कोई अंतर है? या, वे किसी भी परिस्थिति में एक नया NSManagedObject प्राप्त करने के लिए एक ही बात का मतलब है।

उत्तर

7

एनएसएमएनेज्ड ऑब्जेक्ट को तुरंत चालू करने के लिए NSEntityDescription से कक्षा विधि का उपयोग करके दस्तावेज पर जो कहा गया है, उसके आधार पर इसे अपने शीर्षलेख को घोषित/आयात किए बिना करना संभव है। कक्षा का नाम सेट करके आप ऑब्जेक्ट का "पूर्ण रूप से कॉन्फ़िगर किया गया उदाहरण" वापस प्राप्त करेंगे।

चीजें लगातार बदलती समय विकास के शुरुआती चरणों में उपयोगी होती हैं लेकिन यह जोखिम कारक हो सकता है क्योंकि यदि आप अपनी कक्षा के नाम को गलत तरीके से गलत करते हैं, तो आपको कोई संकलन त्रुटियां या चेतावनियां नहीं मिलती हैं, क्योंकि यह एक स्ट्रिंग है।

NSManagedObject से विधि की आवश्यकता है कि आपकी फ़ाइल में आयातित विशिष्ट वर्ग का इंटरफ़ेस और त्रुटियों के खिलाफ इसे और अधिक मजबूत बनाएं, क्योंकि संकलक जांच सकता है कि वह वर्ग मौजूद है या नहीं।

उदाहरण के लिए उनका एक ही परिणाम होगा, वे निर्दिष्ट कक्षा का एक उदाहरण वापस कर देंगे। हालांकि बनाए रखने की गिनती अलग होगा:

- initWithEntity:insertIntoManagedObjectContext: (== +1 संख्या को बनाए रखने)

+ insertnewObjectForEntityForName:inManagedObjectContext:

यहाँ (गिनती == 0 बनाए रखने) यह प्रलेखन

NSEntityDescription Class Reference (insertNewObjectForEntityForName:inManagedObjectContext:) है

वापसी मूल्य

इकाई नाम नामक इकाई के लिए कक्षा का एक नया, स्वत: पूर्ण, पूरी तरह से कॉन्फ़िगर किया गया उदाहरण। उदाहरण में इसकी इकाई विवरण सेट है और इसे संदर्भ में डाला गया है।

चर्चा

इस विधि से आप स्वयं प्रबंधित वस्तु निर्माण के विवरण के बारे में चिंता किए बिना एक दिया इकाई के उदाहरण बनाने के लिए बनाता है।

यह विधि मैक ओएस एक्स v10.4 पर विशेष रूप से उपयोगी है, क्योंकि आप इकाई का प्रतिनिधित्व करने के लिए उपयोग की जाने वाली कक्षा को जानने के बिना इसे एक नया प्रबंधित ऑब्जेक्ट बनाने के लिए उपयोग कर सकते हैं। यह विशेष रूप से विकास जीवन चक्र में फायदेमंद है जब कक्षाएं और कक्षा के नाम अस्थिर होते हैं।

मैक ओएस एक्स v10.5 और बाद में और आईओएस पर, आप इसके बजाय initWithEntity का उपयोग कर सकते हैं: insertIntoManagedObjectContext: जो इकाई के लिए उपयुक्त वर्ग का एक उदाहरण देता है।

NSManagedObject Class Reference (initWithEntity:insertIntoManagedObjectContext:)

वापसी मूल्य

एक इकाई के लिए उपयुक्त वर्ग के उदाहरण प्रारंभ।

चर्चा

NSManagedObject स्वचालित रूप से वर्ग entity.initWithEntity के लिए उपयुक्त की एक उपवर्ग बनाकर ऑब्जेक्टिव-सी 2 गुण सुविधा (देखें "घोषित गुण") का समर्थन करने के गतिशील वर्ग पीढ़ी का उपयोग करता है: insertIntoManagedObjectContext: इसलिए रिटर्न इकाई के लिए उपयुक्त वर्ग का एक उदाहरण। गतिशील रूप से जेनरेट किए गए सबक्लास इकाई द्वारा निर्दिष्ट कक्षा पर आधारित होंगे, इसलिए आपके मॉडल में एक कस्टम क्लास निर्दिष्ट करने से कक्षा को आवंटित कक्षा का अधिग्रहण किया जाएगा।

यदि संदर्भ शून्य नहीं है, तो यह विधि [संदर्भ सम्मिलित करें ऑब्जेक्ट: स्वयं] (जो जागृत होने के कारण जागृत होता है) का आह्वान करता है।

आप इस विधि को ओवरराइड करने से हतोत्साहित हैं-आपको इसके बजाय जागृत होना चाहिए FromInsert और/या awakeFromFetch (यदि इन विधियों के लिए तर्क सामान्य है, तो इसे दोनों से लागू किया जाने वाला तीसरा तरीका माना जाना चाहिए)। यदि आप इस विधि में कस्टम प्रारंभिक प्रदर्शन करते हैं, तो आप पूर्ववत और फिर से संचालन के साथ समस्याएं पैदा कर सकते हैं।

कई अनुप्रयोगों में, किसी विशेष स्टोर में नव निर्मित बनाए गए ऑब्जेक्ट को आवंटित करने की आवश्यकता नहीं है- देखें असाइन ऑब्जेक्ट: toPersistentStore:। यदि आपके एप्लिकेशन में एकाधिक स्टोर हैं और आपको किसी ऑब्जेक्ट को किसी विशिष्ट स्टोर पर असाइन करने की आवश्यकता है, तो आपको किसी प्रबंधित ऑब्जेक्ट की प्रारंभिक विधि में ऐसा नहीं करना चाहिए। ऐसा असाइनमेंट नियंत्रक है- मॉडल-स्तरीय तर्क नहीं।

+0

आपको बहुत बहुत धन्यवाद। – AechoLiu

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