2012-08-03 15 views
5

मेरे ऐप में मेरे पास "मास्टर" NSPrivateQueueConcurrencyType संदर्भ है जो माता-पिता के रूप में NSMainQueueConcurrencyType संदर्भ में कार्य करता है कि दृश्य नियंत्रक भरोसा करते हैं और पास करते हैं। मैं एसिंक बचाता है इसका लाभ लेने के लिए ऐसा करना चाहता था (यह ऐप कोर डेटा के साथ iCloud का उपयोग करता है और सर्वव्यापी लॉग निर्यात करने के लिए बहुत सारे काम करता है)। सेटअप Zarra दृष्टिकोण this articleघोंसला हटाता है और नेस्टेड एनएसएएनएजेडऑबजेक्ट कॉन्टेक्स्ट में बचाता है

के निचले भाग में उल्लेख किया है के समान है अनुप्रयोग के भीतर बचाता है आम तौर पर देखने की तरह:

[context save:nil]; 
[context.parentContext performBlock:^{ 
    [context.parentContext save:nil]; 
}]; 

इस छोटे से संपादन/अद्यतन के लिए अच्छी तरह से काम करने लगता है, लेकिन मैं लेकर संदेह में हूँ जब मैं कई वस्तुओं को हटाता हूं तो मैं क्या देखता हूं (उदाहरण के लिए, एक ऐसी परियोजना को हटाएं जिसमें सैकड़ों कार्य वस्तुएं इससे संबंधित हों)।

उस स्थिति में बचत एसिंक है लेकिन ऐसा लगता है कि मुख्य धागा एक सेमफोर प्रतीक्षा स्थिति में आता है (जैसा कि मैंने डीबगर को रोक दिया था) और प्रभावी रूप से अवरुद्ध है (मैं यूआई में स्क्रॉल नहीं कर सकता) पृष्ठभूमि तक निजी संदर्भ बचाता है।

असल में, मैंने अभी देखा है कि इस ऑब्जेक्ट सेव पैटर्न के बावजूद, एक ऑब्जेक्ट के स्वाइप-टू-डिलीट हटाने में एक उल्लेखनीय देरी होती है, इसलिए ऐसा लगता है कि ऐप में सभी डिलीशन धीमे हैं।

हैं, तो वैकल्पिक रूप से, मैं एक नया NSPrivateQueueConcurrencyType संदर्भ alloc, AppDelegate में मुख्य PSC करने के लिए अपने लगातार दुकान समन्वयक निर्धारित करते हैं, और नष्ट करने और बचाने के लिए, यह अभी भी बहुत काम करती है, लेकिन यूआई अवरुद्ध कभी नहीं है (लेकिन तो मुझे संदर्भों को समन्वय करने, मुख्य संदर्भ में रीफ्रेश करने के बारे में चिंता करने की ज़रूरत है)।

कोई भी विचार जो मैंने गलत किया हो, या आपने यह व्यवहार भी देखा है?

उत्तर

8

हटावट में काफी समय लग सकता है। उन्हें सभी रिश्तों को ठीक करना होगा। बड़े विलोपन करते समय आपको कई चीजें करना चाहिए।

सबसे पहले, पृष्ठभूमि में हटाए जाने पर आपका यूआई ब्लॉक क्यों होता है? चूंकि वह पृष्ठभूमि थ्रेड हटाना ब्लॉक करने में वास्तव में व्यस्त है और आपका यूआई हटाए जाने के दौरान डेटा अपडेट करने की कोशिश कर रहा है।

वास्तविक काम चलाने वाला थ्रेड एक फीफो कतार द्वारा प्रबंधित किया जाता है, इसलिए यदि आप इसे निष्पादित करने के लिए एक बड़ा कार्य देते हैं, तो यह लंबे समय तक चलने तक अन्य कार्यों को करने में सक्षम नहीं होगा।

आप शायद एक एफआरसी का उपयोग कर रहे हैं, और जब ऑब्जेक्ट्स और रिश्ते बदल रहे हैं तो यह अपडेट लाने की कोशिश कर रहा है।

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

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

वैकल्पिक रूप से, आप उच्च प्राथमिकता और कम प्राथमिकता वाली कतार के लिए जीसीडी की उन्नत विशेषताओं का उपयोग भी कर सकते हैं जिसका उपयोग वर्कर थ्रेड को काम करने के लिए किया जाता है। आप अपने लेखन को कम प्राथमिकता कतार पर डाल सकते हैं, और उच्च प्राथमिकता कतार पर आपके पढ़ सकते हैं।

+0

धन्यवाद जॉडी!मैं हर समय आपके सहायक उत्तर में आ जाता हूं। मैं अपने मुद्दों को देखने के लिए कुछ और काम कर रहा हूं। एक स्क्रीन पर मैं अपनी परियोजनाएं प्रस्तुत करता हूं (परियोजनाओं में कई कार्य होते हैं) और एनएसएफआरसी का उपयोग नहीं करते हैं। मैं उन चीजों को देख रहा हूं जिनकी आपने मेरी दूसरी स्क्रीन के लिए उल्लेख किया है (जो कार्य सूचीबद्ध करता है और एक एनएसएफआरसी का उपयोग करता है) जहां घोंसला वाले दृष्टिकोण का उपयोग करके एक ही कार्य का स्वाइप-टू-डिलीट धीमा होता है (और यदि मैं मानक पर वापस आ जाता हूं NSMainQueueConcurrencyType संदर्भ पीएससी से जुड़ा हुआ है) – azsromej

+0

इसे उपकरणों में चलाएं। वास्तव में क्या हो रहा है यह देखने का सबसे अच्छा तरीका है। –

+0

अजीब, यूआई को अवरुद्ध करने वाले सहेजने वाले परिणामों में स्वाइप-टू-डिलीट परिणामों का उपयोग करके, लेकिन संपादन-पूर्ण बटन का उपयोग करके, लाल सर्कल को टैप करते हुए, हटाएं, अवरुद्ध नहीं करता है, दोनों प्रतिबद्धता के माध्यम से बहने के बावजूद संपादन करें: forRowAtIndexPath (जहां deleteObject: और सहेजें: होता है) – azsromej

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