मैं 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
की विधि)?
मैं इसकी पुष्टि कर सकता हूं। यह आईओएस 5 एसडीके में एक दस्तावेज त्रुटि थी और पहले (यदि आपके पास डब्ल्यूडब्ल्यूडीसी 2012 वीडियो तक पहुंच है, तो सत्र 211 और आईओएस 6 एसडीके दस्तावेज़ों की जांच करें)। –
UIGraphicsEndImageContext() को कॉल करना भी बहुत महत्वपूर्ण है या सीपीयू के साथ चीजें बेकार हो रही हैं। – bentford
प्रलेखन को ठीक किया गया है: 'आईओएस 4 और बाद में, आप इस फ़ंक्शन को अपने ऐप के किसी भी थ्रेड से कॉल कर सकते हैं।' – graver