2010-11-20 17 views
5

यूआईएसक्रोलव्यू में इवेंट ट्रैकिंग मुख्य थ्रेड को अवरुद्ध करता है। मैं एक थ्रेड चलाने के लिए मुख्य थ्रेड का उपयोग कर रहा हूं जो कुछ एनीमेशन चलाता है - नतीजा यह है कि स्क्रॉल करने योग्य दृश्य (इसे ऊपर या नीचे खींचकर) के साथ कोई भी उपयोगकर्ता इंटरैक्शन एनीमेशन (मुख्य रनलोप पर चल रहा है) को फ्रीज करने का कारण बनता है। क्या इसके चारों ओर एक रास्ता है?इवेंट ट्रैकिंग मुख्य थ्रेड को अवरुद्ध करता है। कोई फिक्स?

मैंने NSRunloop (CFRunLoopAddCommonMode et al) के बारे में RTFM करने का प्रयास किया है, लेकिन यह बहुत अच्छा है, जिससे मुझे विश्वास होता है कि घटना प्राथमिकताओं/थ्रेड प्राथमिकताओं के साथ झुकाव बेहतर से बचा जाता है। किसी के पास कोई अंतर्दृष्टि है?

+1

आप मुख्य थ्रेड में केवल यूआई सामान ही कर सकते हैं - इसलिए थ्रेड प्राथमिकताओं के साथ गड़बड़ लागू नहीं होगी। मैं उत्सुक हूँ - क्या आपको पता है कि क्या एनएसटीमीटर फायरिंग बंद कर देते हैं, या टाइमर आग करते हैं, लेकिन एनीमेशन में आपके द्वारा किए गए परिवर्तनों को लागू करने से इनकार करते हैं? क्या एनीमेशन * UIScrollView * या * स्क्रॉलव्यू के भीतर * किया गया है? यानी क्या आप वही चीज़ एनिमेट करने और बदलने की कोशिश कर रहे हैं जो स्क्रॉलव्यू स्क्रॉलिंग बदलने की कोशिश कर रहा है? (स्क्रॉल व्यू rects, आदि)? – Brad

+0

धन्यवाद, ब्रैड - जो मैं उम्मीद कर रहा था (शायद खतरनाक रूप से) करने के लिए मुख्य रनलोप में इवेंटट्रैकिंग मोड जोड़ना था, जिससे इवेंटट्रैकिंग रनलोप के साथ एक साथ चलने की अनुमति मिल गई। अवरुद्ध होने वाली एनीमेशन वास्तव में स्क्रॉलव्यू वाले व्यक्ति की तुलना में पूरी तरह से अलग दृश्य पर किया जा रहा है। अपने अन्य प्रश्न का उत्तर देने के लिए, एनएसटीमर पूरी तरह फायरिंग बंद कर देता है। ऐसा लगता है कि उपयोगकर्ता की घटनाओं को (असंबद्ध) UIScrollView पर ट्रैक करने के उच्च प्राथमिकता वाले व्यवसाय द्वारा पूरी तरह अवरुद्ध है। –

उत्तर

16

इसके बजाय NSTimer के स्थिर कंस्ट्रक्टर्स से एक का उपयोग, टाइमर वस्तु बना सकते हैं और इस तरह से मैन्युअल रूप से इसे निर्धारित समय से, निश्चित रूप से काफी अलग होगा विशेष रूप से, क्योंकि यह आप की तरह लगता है ' एक दोहराव टाइमर का उपयोग कर रहे हैं। मुझे लगता है कि आप मूल विचार देख सकते हैं हालांकि।

जब आप रन लूप को स्क्रॉल कर रहे हैं तो एक मोड में जाता है जो "डिफ़ॉल्ट मोड" कार्यों को निष्पादित करने से रोकता है। स्थैतिक एनएसटीमर सभी शेड्यूल को डिफ़ॉल्ट मोड में फ़ंक्शन करता है, यही कारण है कि जब आप स्क्रॉल कर रहे हों तो वे आग नहीं लगाते हैं। मैन्युअल रूप से टाइमर शेड्यूल करने से आप मोड निर्दिष्ट कर सकते हैं और NSRunLoopCommonModes में स्क्रॉलिंग द्वारा उपयोग किए जाने वाले रन मोड शामिल हैं।

+0

शानदार! मैं उपयोग कर रहा था: \t [[NSRunLoop mainRunLoop] addTimer: loopTimer forMode: [NSRunLoop currentMode]]; जो अभी भी अवरुद्ध था। आपका फिक्स पूरी तरह से काम करता है। –

+0

धन्यवाद एक ट्रिलियन! यह फिक्स मेरी आलसी लोडिंग तालिका की उपयोगिता को काफी हद तक बढ़ा देता है। – Nailer

0

एक विचार है कि टाइमर एक अलग थ्रेड पर चलाना है। जब टाइमर आग लगती है, तो उसके पास मुख्य धागे पर चलने की ज़रूरत होती है।

संपादित करें:

आह हाँ, मैं पूरी तरह से कैसे UIScrollView ब्लॉकों काफी सब कुछ के बारे में भूल गया था। एक और विचार (हालांकि बहुत बदसूरत) यह जांचना है कि क्या यूआईएसक्रॉल व्यू के प्रतिनिधि तरीकों (यानी -scrollviewDidScroll इत्यादि) के दौरान टाइमर निकाल दिया गया है। यह वास्तव में एक हैक का प्रकार है, लेकिन यह मूल रूप से एकमात्र तरीका है जिसे मैं स्क्रॉलिंग के दौरान किसी भी कोड को निष्पादित करने के बारे में जानता हूं। initWithFireDate को

NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:delayInSeconds] interval:0 target:yourObject selector:yourSelector userInfo:nil repeats:NO]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
[timer release]; 

आपका पैरामीटर:

+0

धन्यवाद, हाँ, मैं वास्तव में मुख्य थ्रेड पर पहले से ही अपने एनीमेशन टाइमर चला रहा हूं। ऐसा लगता है कि उपयोगकर्ता की घटनाओं के पीछे की दृश्य मुख्य धागे की तुलना में उच्च प्राथमिकता पर चलती है, इसलिए जब कुछ निरंतर (स्क्रॉलिंग की तरह) होता है, तो यह मुख्य धागे को लंबे समय तक अवरुद्ध करता है ... –

+0

@ एंडी मिलबर्न: एक और विचार के लिए संपादित देखें। –

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