2013-02-13 9 views
5

समझाते समय उत्परिवर्तित किया गया था, मेरा ऐप स्क्रीन से प्रतीक्षा दृश्य को हटाते समय कुछ समय दुर्घटनाग्रस्त हो जाता है। कृपया मुझे मार्गदर्शन करें कि मैं नीचे दिए गए कोड को कैसे सुधार सकता हूं।संग्रह <CALayerArray: 0x1ed8faa0> को


प्रतीक्षा दृश्य केवल तभी कॉल किया जाता है जब ऐप सर्वर से कुछ डाउनलोड कर रहा हो। और जब यह डाउनलोड पूरा हो जाता है तो मैं removeWaitView विधि को कॉल करता हूं।

अपवाद का प्रकार: NSGenericException

कारण: संग्रह जबकि प्रगणित किया जा रहा उत्परिवर्तित गया था। जबकि यह भी उल्लेख किया जा रहा है एक संग्रह (एक सरणी की तरह इस मामले में कुछ) को संशोधित किया जा रहा है -

+(void) removeWaitView:(UIView *) view{ 
    NSLog(@"Shared->removeWaitView:"); 
    UIView *temp=nil; 
    temp=[view viewWithTag:kWaitViewTag]; 
    if (temp!=nil) { 
     [temp removeFromSuperview]; 
    } 
} 

मेरी waitview जोड़ने कोड

+(void) showWaitViewInView:(UIView *)view withText:(NSString *)text{ 
    NSLog(@"Shared->showWaitViewWithtag"); 
    UIView *temp=nil; 
    temp=[view viewWithTag:kWaitViewTag]; 
    if (temp!=nil) 
    { 
     return; 
    } 
    //width 110 height 40 
    WaitViewByIqbal *waitView=[[WaitViewByIqbal alloc] initWithFrame:CGRectMake(0,0,90,35)]; 
    waitView.center=CGPointMake(view.frame.size.width/2,(view.frame.size. height/2) -15); 
    waitView.tag=kWaitViewTag; // waitView.waitLabel.text=text; 
    [view addSubview:waitView]; 
    [waitView release]; 
} 
+0

अपवाद का पूरा बैकट्रैक देखना उपयोगी होगा। (यदि आप इस जानकारी को कैसे ढूंढें, तो आप शायद Google को आस-पास कर सकते हैं।) –

+1

'removeWaitView' कैसे कहा जाता है? – dasblinkenlight

उत्तर

13

अपवाद बहुत स्पष्ट है।

इस विशिष्ट मामले में हम परतों की सरणी के बारे में बात कर रहे हैं, या बेहतर कहा है, UIView के उदाहरण जो सभी परतों द्वारा समर्थित हैं।

जब आप removeFromSuperview या addSubview पर कॉल कर रहे हैं तो संशोधन होते हैं। पुनरावृत्ति के दौरान गणना कभी भी हो सकती है।

मेरा अनुमान है - आप मुख्य तरीकों से अपने तरीकों को नहीं बुला रहे हैं और मुख्य धागा वर्तमान में फिर से चल रहा है, इसलिए आपको रेसिंग की स्थिति मिल जाएगी।

समाधान: इन विधियों को केवल मुख्य धागे से कॉल करें।

+0

हम्म। मैं हमेशा मुख्य धागे पर इस तरह की विधि को कॉल करने का प्रयास करता हूं लेकिन ऐसा लगता है कि आप सही हैं क्योंकि यह अपवाद केवल मेरे कोड के अनुसार आता है (मेरे कोड के अनुसार) जब इसे मुख्य धागे से नहीं कहा जाता है। क्या मैं सही हू? –

+0

@ डेवलपर हारून हेमैन का जवाब एक और संभावित स्पष्टीकरण है। यह आपके स्टैक ट्रेस से स्पष्ट होना चाहिए। – Sulthan

+1

बहुत स्मार्ट विश्लेषण। धन्यवाद। – Martin

3

यह संभव है कि आप प्रतीक्षा दृश्य को जोड़ रहे हों या हटा रहे हों, जबकि प्रतीक्षा व्यू के भाई बहनों (यह सुपरव्यू के सबव्यूज़) के माध्यम से फिर से चल रहा है। यह देखने के लिए जांचें कि कौन से तरीके removeWaitView और showWaitInView पर कॉल करते हैं, यह सुनिश्चित करने के लिए कि कॉलिंग विधियां व्यू व्यू के भाई बहन (वेटव्यू के पर्यवेक्षण के सबव्यूज़) को दोहराने के लिए लूप के भीतर से व्यू व्यू विधियों को शो/हटाएं।

+0

हां, यह समस्या पैदा कर सकता है अगर मैंने लूप में उपयोग किया था, नहीं, मैं इसे लूप में उपयोग नहीं कर रहा हूं। जैसा कि मैंने अपना प्रश्न संपादित किया था, जानकारी के लिए धन्यवाद –

+0

सहायता करने में खुशी हुई। आमतौर पर, एक लूप के भीतर से स्पष्ट उत्परिवर्तन सबसे आम अपराधी है। लेकिन उत्परिवर्तन एक और धागे से भी हो सकता है (जिसे @ सुल्तान ने बताया)। –

5

आपको सरणी की एक प्रति प्राप्त करनी चाहिए, इसलिए आप इसे कोड करने के दौरान संशोधित होने का मौका नहीं लेते हैं। बेशक यह मौका छोड़ देता है कि उत्परिवर्तन के परिणामस्वरूप एक नया आइटम जोड़ा जा सकता है, इस प्रकार आपकी गणना उस सरणी वस्तु को याद कर देगी। यहां आपके प्रश्न के शीर्षक के लिए एक उदाहरण दिया गया है:

[[viewLayer.sublayers copy] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
      CALayer * subLayer = obj; 
      if(subLayer == theLayerToBeDeleted){ 
       [subLayer removeFromSuperlayer]; 
      } 

     }]; 
संबंधित मुद्दे