2012-03-31 13 views
8

तो, this answer में और the iOS 4.0 release notes में उल्लिखित, UIKit अब कुछ धागे की सुरक्षित ड्राइंग की सुविधा है:UIKit ड्राइंग थ्रेड सुरक्षित है: आप ग्राफिक्स संदर्भ कैसे प्राप्त करते हैं?

UIKit में एक ग्राफिक्स संदर्भ के लिए आकर्षित अब धागा सुरक्षित है। विशेष रूप से:

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

यह बढ़िया है, लेकिन आप इसका उपयोग कैसे करते हैं?

जहां तक ​​मुझे पता है हूँ, किसी भी समय आप -drawRect: अंदर नहीं कर रहे हैं आप केवल UIKit/UIGraphics सामान का उपयोग कर आकर्षित कर सकते हैं आप UIGraphicsBeginImageContext() या UIGraphicsPushContext() के माध्यम से अपने स्वयं के संदर्भ बना चुके हैं तो, लेकिन उन कार्यों सुरक्षित थ्रेड नहीं कर रहे हैं दस्तावेज़ों के अनुसार, और -drawRect() हमेशा मुख्य धागे पर बुलाया जाता है।

मुझे लगता है कि मुख्य धागे पर एक छवि संदर्भ बनाना और फिर पृष्ठभूमि विधि शुरू करना दौड़ की स्थिति के कारण बहुत बुरा विचार होगा।

तो, मैं इस multithreaded UIKit- आधारित ड्राइंग सामग्री का उपयोग कैसे करूं जो आईओएस 4 में पेश किया गया था? एक सक्रिय UIKit ग्राफिक्स संदर्भ प्राप्त करने के अन्य तरीकों से मुझे याद आया है?

पीएस मुझे पता है कि मैं सिर्फ कोर ग्राफिक्स का उपयोग कर आकर्षित कर सकता हूं और इसके साथ किया जा सकता हूं। विभिन्न कारणों से (विरासत कोड) मैं UIKit आधारित ड्राइंग विधियों का उपयोग करना जारी रखना चाहता हूं।

उत्तर

8

मेरा विश्वास, कुछ प्रयासों के आधार पर और विभिन्न दस्तावेजों के आधार पर, यह विश्वास है कि UIGraphicsPushContext() के लिए दस्तावेज़ गलत हैं।

मेरा मानना ​​है कि UIGraphicsPushContext() वास्तव में धागा सुरक्षित है। विशेष संकेत यह है कि यह सच है QA1637, जो कहता है "आईओएस 4.0 के साथ शुरुआत, यूआईकिट में ग्राफिक्स संदर्भ में ड्राइंग थ्रेड-सुरक्षित है। इसमें वर्तमान ग्राफिक्स स्टैक तक पहुंचने और छेड़छाड़ करने, छवियों और तारों को चित्रित करने और उपयोग करने में शामिल है माध्यमिक धागे से रंग और फ़ॉन्ट वस्तुओं। " (जोर मेरा)

मैं स्वीकार करता हूं कि यह हमेशा दस्तावेज़ों के विरोधाभास में थ्रेड सुरक्षा मानने के लिए एक पागल प्रस्ताव है। लेकिन मुझे विश्वास है कि यह एक दस्तावेज त्रुटि है। मैंने इसे ट्रैक करने के लिए rdar://11161530 खोला है। कृपया डुप्लिकेट करें

+0

मैंने वास्तव में इसके बारे में एक डीटीएस मुद्दा खोला है, इसलिए मुझे उम्मीद है कि वहां से पता चल जाएगा। जिस चीज में मैंने इस सवाल का जिक्र नहीं किया था, वह था कि मेरे परीक्षणों में (हालांकि मैं उपयोग कर रहा था ... startImageContext), ज्यादातर समय चीजें ठीक काम कर रही थीं, लेकिन कभी-कभी मुझे 'एनएसएसटींग ड्रॉइन्रैक' में एक क्रैश हो रहा था: withFont: ' । यह कष्टप्रद रूप से आसानी से पुन: उत्पन्न नहीं होता है, लेकिन जब भी यह दुर्घटनाग्रस्त हो जाता है। अगर मैं कुछ गलत कर रहा हूं या यह कभी काम नहीं करेगा तो मैं काम करने की कोशिश कर रहा हूं। –

+0

मैंने पहले इस तरह के दुर्घटना को नहीं देखा था, लेकिन मैं अपने प्रयोगों में अत्यधिक आक्रामक नहीं रहा हूं। यह काफी परेशान है और यह सुझाव दे सकता है कि मेरा विश्वास गलत है। कृपया हमें बताएं कि डीटीएस परिणाम क्या है। –

+0

अधिक जानकारी: क्रैश की विशिष्ट चीज़ 'वेबकोर :: FontFallbackList :: ~ FontFallbackList()() 'है। –

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

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