2012-08-02 18 views
5

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

if (!self.someManagedObject) { 

    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:@[[NSBundle mainBundle]]]; 
    NSPersistentStoreCoordinator *storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; 
    [storeCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:nil]; 

    NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    [managedObjectContext setPersistentStoreCoordinator:storeCoordinator]; 

    self.someManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"SomeObject" inManagedObjectContext:managedObjectContext]; 
    NSLog(@"%@", self.someManagedObject.managedObjectContext); 
} 

यह viewDidLoad का एक हिस्सा है: यह कैसे मैं अपने अस्थायी संदर्भ बना सकते हैं और मैं इसे कैसे में एक ऑब्जेक्ट सम्मिलित है। कंसोल में यह दिखाता है कि प्रबंधित ऑब्जेक्ट संदर्भ में एक मान है।

हालांकि, सही इस के बाद बयान करता है, तो (viewDidLoad भी भीतर, self.someManagedObject.managedObjectContext नहीं के बराबर है। मैं अब और नहीं देख सकते हैं (यह बस दायरे से बाहर चला जाता है) क्यों स्थानीय चर उपलब्ध नहीं होगा, लेकिन प्रबंधित वस्तु की संपत्ति अभी भी सेट किया जाना चाहिए , है ना?

मैं जानता हूँ कि मैं प्रबंधित वस्तु संदर्भ स्टोर करने के लिए एक संपत्ति बना सकते हैं, लेकिन मैं नहीं बल्कि यह इस तरह से काम करने के लिए मिलता है चाहता हूँ।

+0

'someObject'' someManagedObject' जैसा ही है? – aforaudrey

+0

ओह, हाँ। मैंने पहले 'कुछ ऑब्जेक्ट' रखा, लेकिन फिर यह स्पष्ट करना चाहता था कि यह एक एनएसएमएनेज ऑब्जेक्ट है। –

+0

आपने जांच की है कि 'self.someManagedObject' गैर-शून्य है? मान लीजिए 'insertNewObject ...' विफल रहा है या आपकी संपत्ति अनोखी है, जो आप जो देख रहे हैं उसे समझाएगी। – Tommy

उत्तर

15

मैं हाल ही में फिर से वही समस्या में पड़ गए, हालांकि यह एक अलग में था परिस्थिति। मुझे एक अस्थायी प्रबंधित ऑब्जेक्ट संदर्भ की आवश्यकता थी, जो मुख्य रूप से पूरी तरह से अलग थी, लेकिन फिर से यह गुस्से से बाहर होने के बाद गायब होने की समस्या में फिर से चला गया। इस बार मैंने आगे की जांच करने का फैसला किया, और अंततः मुझे एहसास हुआ कि managedObjectContextNSManagedObject की संपत्ति नहीं है, लेकिन एक विधि है। यह दो चीजों में से एक का अर्थ है:

  1. यह संदर्भ
  2. प्रबंधित वस्तु संदर्भ किसी अन्य तरीके से ली गई है, तो करने के लिए है कि संपत्ति will not hold a strong reference अंतर्निहित कार्यान्वयन में एक संपत्ति का उपयोग करता है, तो, यह भी एक पकड़ नहीं होगा उस संदर्भ के लिए मजबूत संदर्भ।

या तो मामले में, संदर्भ, कोई मजबूत संदर्भ होते हैं क्षेत्र से बाहर चला जाता है, और NSManagedObject एक nilmanagedObjectContext है।

समाधान इसके लिए एक मजबूत संपत्ति बनाकर संदर्भ को बस रखना था।

+0

क्या आप जानते हैं कि ऐसा क्यों है? (मेरे पास इसके लिए एक अलग SO [प्रश्न] (http://stackoverflow.com/q/23687160/1108362) है ...) – jsadler

-2

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

नई वस्तु को मुख्य संदर्भ में डालें। उपयोगकर्ता को अपना डेटा इनपुट करने दें। वह टूट जाता है, तो बस

[managedObjectContext rollback]; 

फोन या, यदि उपयोगकर्ता खत्म और सभी डेटा मान्य है, फोन

[managedObjectContext save:nil]; 
+0

यह एक अच्छा समाधान भी लगता है, लेकिन 'रोलबैक' कितनी दूर है? अंतिम बचत करने के लिए? मैं ऑटो-सेविंग पर निर्भर हूं, इसलिए मुझे मैन्युअल रूप से 'सेव' पर कॉल करना होगा (जो कोई समस्या नहीं है, लेकिन मुझे जानना होगा)। –

+0

अंतिम बचत - यह उससे थोड़ा अधिक जटिल हो सकता है, लेकिन केवल विशेष परिस्थितियों में। - इसके अलावा, मुझे "ऑटो-सेविंग" के बारे में पता नहीं था। स्पष्ट रूप से इसे करने के लिए निश्चित रूप से बेहतर है। – Mundi

+0

मुझे इस तरह से ऐसा करने में एक समस्या है: मुझे सभी संभावित तरीकों की जांच करनी है कि उपयोगकर्ता सभी जानकारी भरने से बच सकते हैं। यह जांचने के बजाय कि उपयोगकर्ता ने कुछ "गलत" किया है (जैसा कि प्रक्रिया में बाधा डाली गई थी), प्रक्रिया पूरी होने पर मैं सहेजने में सक्षम होना चाहता हूं। प्रक्रिया से मेरा मतलब है "स्क्रीन के माध्यम से जा रहा है जिसमें उपयोगकर्ता जानकारी दर्ज करता है"। मैं हर संभव बाधा के लिए 'रोलबैक' को कॉल नहीं करना चाहता हूं। –