2016-12-19 6 views
5

जीसीडी:एक autoreleasepool में दायरे का उपयोग करने का सही तरीका क्या है?

का उपयोग करके दायरे को एक्सेस करने के बारे में यह कहना है कि "प्रेषण कतार से दायरे तक पहुंचने पर आपको एक स्पष्ट ऑटोरेलीज पूल का उपयोग करना चाहिए।"

Documentation

मैं अपने अनुप्रयोग में इस अभ्यास का इस्तेमाल किया है, लेकिन मैं अचानक मेरे कंसोल में निम्न संदेश देख रहा हूँ: "RLMRealm उदाहरण एक लिखने लेनदेन के दौरान पुनः आवंटित की जाती थी"।

यह कोई त्रुटि नहीं फेंक रहा है, यह चुपचाप इसे कंसोल पर प्रिंट कर रहा है। डेटाबेस में कुछ भी नहीं लिखा गया है।

मुझे यह समस्या github पर मिली जो बहुत समान लगती है।

मेरा प्रश्न अब है: मुझे किस अभ्यास का उपयोग करना चाहिए? जिलाब मुद्दे में प्राप्त वास्तविक दस्तावेज या उत्तर में इस्तेमाल किया गया एक?

किसी भी स्पष्टीकरण के लिए धन्यवाद।

उत्तर

3

GCD ब्लॉक अपने स्वयं के @autorelease पूल का प्रबंधन, लेकिन कोई गारंटी जब कि वास्तव में हो जाएगा वहाँ है, और यह ब्लॉक में ही पूरा कर लिया है के बाद समय भी पर्याप्त मात्रा में हो सकता है (देखें इस SO answer)

क्षेत्र पढ़ा रखता है धागे के सभी उदाहरणों पर ताले (इस प्रकार रीयलम से अभी भी पढ़ना संभव है जबकि एक अन्य धागे पर एक लेखन लेनदेन खुला है), इसलिए नतीजतन, जब आप ऐसा कर लें तो एक वास्तविक उदाहरण को स्पष्ट रूप से अस्वीकार करने की अनुशंसा की जाती है ताकि डिस्क स्पेस पुनः दावा किया जा सकता है।

यदि आप @autoreleasepool का उपयोग नहीं करते हैं, तो कुछ भी बुरा नहीं होगा; डिस्क पर दायरे फ़ाइल का आकार बढ़ जाएगा।

सर्वोत्तम अभ्यास @autoreleasepool ब्लॉक का उपयोग करना है, और यह सुनिश्चित करने के लिए कि आपके सभी लेखन लेनदेन उस ब्लॉक के अंदर किए गए हैं।

@autoreleasepool { 
    let realm = try! Realm() 
    try! realm.write { 
     // ... perform changes 
    } 
} 

यह आमतौर पर beginWrite()/commitWrite() से अधिक realm.write का उपयोग करने के बाद से यह आप सुरक्षित रूप से प्रतिबद्ध करने के लिए भूल के बिना लेनदेन प्रदर्शन करने देता है, और भी कुछ अतिरिक्त त्रुटि हैंडलिंग प्रदान करता है अनुशंसा की जाती है।

गिटहब पर इस मुद्दे के साथ समस्या यह थी कि एक तर्क पथ था जो लिखने के लेनदेन से पहले बाहर निकलने के लिए @autoreleasepool का कारण बनता था। इस मामले में, आपको अपने कोड तर्क की समीक्षा करने और सुनिश्चित करने की आवश्यकता है कि आपके पास कुछ भी समान नहीं है।

+0

'कुछ भी बुरा नहीं होगा; डिस्क पर दायरे फ़ाइल का आकार बढ़ जाएगा। यदि यह बहुत लंबा लगता है, तो आपका दायरा आकार समेकित रूप से बढ़ सकता है (समवर्ती धागे की संख्या के आधार पर)। – EpicPandaForce

+0

यह यहां लागू नहीं होता है। वह तब होता है जब लंबे समय से चलने वाले लेनदेन लेनदेन लॉग आकार में वृद्धि करते हैं। पृष्ठभूमि को नाली नहीं करना वास्तविक उदाहरणों ने कभी भी आकार में वृद्धि नहीं की, लेकिन इससे उन्हें आवश्यकतानुसार अधिक बढ़ने का कारण बन गया। किसी भी मामले में, हम लेनदेन लॉग मुद्दे से अवगत हैं और समाधान पर काम कर रहे हैं: https://github.com/realm/realm-core/issues/2343 :) – TiM

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