2016-04-29 7 views
5

के साथ बच्चे के संदर्भ का उपयोग करना मुझे NSPrivateQueueConcurrencyType के साथ स्क्रैच पैड के रूप में बाल संदर्भ का उपयोग करने में समस्या हो रही है।NSPrivateQueueConcurrency का उपयोग करना NSPrivateQueueConcurrencyType मूल संदर्भ

मेरे कोर डेटा ढेर इस तरह दिखता है: core data stack

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

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

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

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

संपादित करें:

दुर्घटना मैं हो रही हैं, जब एक कार्यकर्ता बच्चे संदर्भ एक मिल रहा है या ऑपरेशन बनाने का अनुरोध लाने पर अमल करने की कोशिश करता है। यह भविष्य में किसी भी प्रबंधित ऑब्जेक्ट का उपयोग नहीं कर रहा है, और इसे performBlockAndWait में लपेटा गया है। मुझे जो स्पष्टीकरण मिल रहा है वह है 'एनएसआईएननल इन्फॉन्सिस्टेंसी अपवाद', कारण: 'कथन अभी भी सक्रिय है' दुर्घटना अस्थायी है, लेकिन अब तक ऐसा प्रतीत होता है कि यह तब होता है जब मैंने नियुक्त कार्यकर्ता बाल संदर्भ किया है। (यानी मेरे आरेख में कार्यकर्ता बाल संदर्भ में अपनी स्वयं के निर्माण वस्तुओं का एक बाल संदर्भ होगा)

क्रैश का कारण प्राप्त करने का अनुरोध हमेशा खोज या निर्माण ऑपरेशन के लिए होता है, इसलिए यह किसी भी ऑब्जेक्ट को अद्वितीय पहचानकर्ता के साथ लाने का प्रयास करता है आयात की जा रही वस्तुओं के पहचानकर्ता से मेल खाता संपत्ति। तो भविष्यवाणी हमेशा "identifier in ["1234", "abc", "etc" ]

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

+0

प्रदर्शन-ब्लॉक के अंदर आप क्या कर रहे हैं जो बहु-थ्रेडिंग दावे का कारण बन रहा है? यह गलत होने के कारण एक सुराग प्रदान करेगा। – Tim

उत्तर

0

अपना भ्रूण दिखा रहा है और इसकी भविष्यवाणी यह ​​निर्धारित करने में मदद करेगी कि क्या हो रहा है। ऐसा लगता है कि आप NSManagedObject तक थ्रेड सीमाओं तक पहुंच रहे हैं, शायद आपके भविष्य में एक का उपयोग कर रहे हैं?

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

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

क्या आप यह सुनिश्चित करने के लिए उपकरण चलाते हैं कि ब्लॉक एमओसी से है? हर मामले में मैंने उस मुद्दे के बारे में सुना है, मैंने इसे कुछ और पाया है (आमतौर पर यूआई संबंधित) जो इस मुद्दे का वास्तविक स्रोत था। जब तक आप खराब भविष्यवाणी के खिलाफ THOUSANDS प्राप्त कर रहे हैं, तो आपको किसी फ़ेच के लिए हिट महसूस नहीं करना चाहिए। फिर भी इस मुद्दे को हल करने के लिए भविष्यवाणी की जा सकती है।

सहेजने के लिए, आप या तो ए) अपनी बचत आवृत्ति बढ़ा सकते हैं या बी) डिस्क के लिए लेखक होने के लिए एक निजी एमओसी स्थापित करें। मैं बी पसंद करता हूं ताकि सभी बचाए जाने वाले एसिंक्रोनस होने की गारंटी दी जा सके।

+0

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

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