2012-06-07 10 views
9

मैं UIGraphicsBeginImageContextWithOptions और थ्रेडिंग के बारे में थोड़ा उलझन में हूं क्योंकि UIKit Function ReferenceUIGraphicsBeginImageContextWithOptions के अनुसार केवल मुख्य धागे पर ही जाना जाना चाहिए। जब इसे बुलाया जाता है तो यह बिटमैप-आधारित संदर्भ बनाता है, जो कोरग्राफिक्स के कार्यों के साथ या drawInRect:UIImage, -drawInRect:withFont:NSString के लिए या तो इस तरह के तरीकों के साथ छेड़छाड़ करने के लिए तैयार है। CoreGraphics 'ड्राइंग के लिए सब कुछ स्पष्ट है - आप एक CGContextRef तर्क को पास करते हैं जिसे प्रत्येक फ़ंक्शन में छेड़छाड़ की जा रही है, लेकिन UIKit ड्राइंग विधियां स्टैक में वर्तमान संदर्भ का उपयोग करती हैं। What's New in iOS 4.0 की रिलीज नोट्स में यह लिखा है किUIGraphicsBeginImageContextWithOptions और Multithreading

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

अब तक इतना अच्छा है। दिलचस्प हिस्सा यह है कि मेरे पास एक प्रोजेक्ट है, जहां मैं कुछ गहन चित्र करता हूं और UIGraphicsBeginImageContextWithOptions के साथ संदर्भ बनाकर कई छवियां बनाता हूं, लेकिन जब ये ऑपरेशन अधिक समय लेने वाला होता और मैंने ड्राइंग को पृष्ठभूमि थ्रेड में ले जाया और तैयार होने पर उन्हें कुछ एनिमेशन के साथ स्क्रीन पर प्रदर्शित करें और सब ठीक काम करता है - कोई दुर्घटना नहीं, कोई रिसाव नहीं। चित्रों की अपेक्षा की जाती है क्योंकि ऐसा लगता है कि UIGraphicsBeginImageContextWithOptions पृष्ठभूमि धागे के लिए एक संदर्भ बनाता है और सबकुछ ठीक लगता है।
तो मेरे प्रश्न हैं:
- केवल मुख्य थ्रेड पर UIGraphicsBeginImageContextWithOptions पर कॉल करना आवश्यक क्यों है क्योंकि यह पृष्ठभूमि में ठीक काम कर रहा है?
- उदाहरण के लिए UIImage की -drawInRect: विधि का उपयोग कैसे करें, पृष्ठभूमि थ्रेड में, जहां मेरे पास वर्तमान संदर्भ नहीं है और मैं ऐसा नहीं कर सकता क्योंकि मैं UIGraphicsBeginImageContextWithOptions पर कॉल नहीं कर सकता?
- UIKit के तरीकों का उपयोग करके पृष्ठभूमि छवि मैनिपुलेशन के लिए सही दृष्टिकोण क्या है (मुझे पता है कि मैं CGBitmapContextCreate का भी उपयोग कर सकता हूं, लेकिन यह न तो संदर्भित स्टैक में बनाए गए संदर्भ को धक्का देता है और न ही -drawInRect: का उपयोग करने के लिए मैं इसे स्वयं करने में सक्षम हूं UIImage की विधि)?

उत्तर

21

तो, जांच के कुछ दिनों के बाद, यूआईकिट संदर्भ में हेरफेर करने का तरीका थ्रेड-सुरक्षित है और फिर भी आप मुख्य के अलावा किसी थ्रेड में एक बनाने में सक्षम नहीं हैं क्योंकि UIGraphicsBeginImageContextWithOptions "को कॉल किया जाना चाहिए केवल मुख्य धागे पर ", लेकिन अभी भी ऐसा करने से पूरी तरह से ठीक काम करता है और इस विषय पर कुछ छोटी पोस्ट पढ़ने और ऐप्पल के डेवलपर मंचों पर अन्य लोगों के साथ चर्चा करने के बाद मैं स्पष्ट रूप से बता सकता हूं कि UIGraphicsBeginImageContextWithOptions, UIGraphicsPushContext और UIGraphicsPopContext के बारे में प्रलेखन में क्या कहा गया है WRONG और उन विधियों को बुलाया जा सकता है और समस्या बिना किसी समस्या के किसी अन्य धागे में उपयोग की जाती है।तो UIGraphicsBeginImageContextWithOptions, UIGraphicsPushContext और UIGraphicsPopContextथ्रेड-सुरक्षित हैं।

+3

मैं इसकी पुष्टि कर सकता हूं। यह आईओएस 5 एसडीके में एक दस्तावेज त्रुटि थी और पहले (यदि आपके पास डब्ल्यूडब्ल्यूडीसी 2012 वीडियो तक पहुंच है, तो सत्र 211 और आईओएस 6 एसडीके दस्तावेज़ों की जांच करें)। –

+0

UIGraphicsEndImageContext() को कॉल करना भी बहुत महत्वपूर्ण है या सीपीयू के साथ चीजें बेकार हो रही हैं। – bentford

+2

प्रलेखन को ठीक किया गया है: 'आईओएस 4 और बाद में, आप इस फ़ंक्शन को अपने ऐप के किसी भी थ्रेड से कॉल कर सकते हैं।' – graver

0

आंशिक उत्तर: "UIKit संदर्भ" स्टैक के शीर्ष पर अपने स्वयं के सीजी संदर्भ को धक्का देने के लिए UIGraphicsPushContext का उपयोग करें और सबकुछ (उस धागे से, जैसा कि मैंने ऐप्पल के दस्तावेज की व्याख्या की है) उस पर पेंट करेगा। UIKit संदर्भ स्टैक से इसे पॉप करने के लिए UIGraphicsPopContext का उपयोग करना न भूलें।

यह सभी UIKit ड्राइंग ऑपरेशंस पर लागू होता है; उदाहरण के लिए UIImage एस ड्राइंग, जैसा आपने पूछा था। संदर्भ को पुश करें, ड्रा करें, फिर संदर्भ पॉप करें।

+0

यह मेरे विचारों में से एक था, लेकिन दुर्भाग्य से दस्तावेज़ कहते हैं: 'आपको इस कार्य को केवल अपने आवेदन के मुख्य धागे से ही कॉल करना चाहिए।' 'यूआईजीआरएक्सिक्स पुशकॉन्टेक्स्ट' और' यूग्राफिक्सपॉपकॉन्टेक्स्ट ' – graver

+2

दोनों के लिए मुझे याद नहीं है कि मैं और मैं इसे नहीं मिला, लेकिन मैंने इन चीजों को 2011 या 2010 से डब्ल्यूडब्ल्यूडीसी वीडियो में बहुत विस्तार से देखा। मुझे जो याद है, उससे मेरा अंतर्ज्ञान यह है कि कुछ दस्तावेज संक्षेप में भ्रामक हैं और यह सब कुछ गंभीर तरीके से काम करेगा अगर आप वीडियो से कुछ नियमों का पालन करते हैं। (मैं आपको इस सलाह पर खेत पर शर्त लगाने की उम्मीद नहीं करता, लेकिन मुझे लगता है कि अगर आपको वीडियो मिला तो यह आपके सवालों का जवाब देगा।) – Jesper

+0

मैं अब एक नज़र डालेगा और एक जवाब लिखूंगा। – graver

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

  • कोई संबंधित समस्या नहीं^_^