2010-06-28 10 views
12

इसलिए मैं आवश्यकतानुसार पंक्तियों को डालने/हटाने/पुनः लोड करके एक टेबलव्यू अपडेट कर रहा हूं, लेकिन, क्योंकि मुझे 100% आत्मविश्वास नहीं है कि तालिकादृश्य हमेशा सही ढंग से अपडेट होगा, क्या अपडेट के खराब बैच से सुरक्षित रूप से विफल होने का कोई तरीका है ?UITableView: खराब अपडेट के बाद NSInternalInconsistencyException से पुनर्प्राप्त?

अभी, मैं इस है:

// Try to animate the updates. If something goes wrong, just reloadData. 
    @try { 
     [tableView beginUpdates]; 
     [tableView deleteRowsAtIndexPaths:deleteArray withRowAnimation:UITableViewRowAnimationMiddle]; 
     [tableView reloadRowsAtIndexPaths:reloadArray withRowAnimation:UITableViewRowAnimationNone]; 
     [tableView insertRowsAtIndexPaths:insertArray withRowAnimation:UITableViewRowAnimationMiddle]; 
     [tableView endUpdates]; 
    } 
    @catch (NSException * e) { 
     if([[e name] isEqualToString:NSInternalInconsistencyException]){  
      [tableView reloadData]; 
      NSLog(@"animation failed, just reloading data"); 
     } 
     else { 
      @throw e; 
     } 
    } 

हालांकि, एक बार यह है कि अपवाद हिट, reloadData काम नहीं लगता है। क्या UITableView को मूल रूप से एक कार्यशील स्थिति में रीसेट करने का कोई अन्य तरीका है?

उत्तर

3

अधिक आदर्श रूप से आपको तालिका को उस सरणी के साथ बैक करना चाहिए जो तालिका की अपेक्षा करने की गारंटी देता है। UIKit अपवादों को घातक होने की अपेक्षा करता है (यह ऐप्पल के दर्शन के साथ है कि अपवाद प्रोग्रामर त्रुटि इंगित करता है।)

+2

हां, यह बेहद आदर्श होगा। मेरा मतलब स्नैप करने का मतलब नहीं है, लेकिन आदर्श रूप से सब कुछ ठीक काम करेगा और कुछ भी गलत नहीं होगा। दुर्भाग्य से, शायद ही कभी होता है। और उत्पादन कोड में, मैं उपयोगकर्ता के चेहरे में ऐप को क्रैश करने के बजाय सुरक्षित रूप से विफल रहता हूं। –

+3

@ डेविड अच्छी तरह से, अगर आप पूरी तरह से ठीक होने पर सेट हैं। मैं अपवाद पकड़ूंगा, फिर तालिका दृश्य को फिर से बनाएं। जानें कि यह लगभग निश्चित रूप से कुछ स्मृति को रिसाव करेगा और अन्य चीजों को अवांछित राज्यों में छोड़ सकता है। – cobbal

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