2009-07-25 6 views
7

मैं कुछ मौजूदा भारी हाथ कोड को संशोधित करने पर काम कर रहा हूं जो किसी भी बदलाव पर [tableView reloadData] को कॉल करने के लिए काम कर रहा है, ताकि सम्मिलित/हटाए गए तरीकों के साथ अधिक विशिष्ट तालिका अपडेट का उपयोग किया जा सके।UITableView insertSections: withRowAnimation: सभी तालिका कक्षों का अनुरोध किया जा सकता है

हालांकि, मुझे ऐसा करने में कुछ बुरा व्यवहार हो रहा है। पहले, जैसा कि कोई कल्पना करेगा, जब टेबल लोड हो जाए, तो उसने उस पंक्तियों के लिए केवल कोशिकाओं से अनुरोध किया जो उस समय दिखाई दे रहे थे। यह व्यवहार तब था जब reloadData का उपयोग किया गया था।

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

परिवर्तन है इस सरल, कोड है कि tableView में परिणाम ही दिखाई पंक्तियों के लिए पूछ:

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context { 
    // ... ensure it's the right key 
    [tableView reloadData]; 
} 

कोड कि tableView सब कुछ के लिए पूछ में परिणाम:

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context { 
    // ... ensure it's the right key 
    NSUInteger sectionCount = [self sectionCount]; 
    NSIndexSet *indices = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)]; 
    [tableView insertSections:indices withRowAnimation:UITableViewRowAnimationFade]; 
} 

मैं वापस टॉगल कर सकते हैं और व्यवहार परिवर्तन देखने के लिए आगे। निराशा होती। विचार?


यह देखने के लिए कि क्या किसी के पास कोई और अंतर्दृष्टि है या नहीं, सिर्फ एक उदारता जोड़ना।

स्टार्टअपडेट्स/एंड अपडेट्स कुछ भी प्रभावित नहीं करता है, और मैं इसकी अपेक्षा नहीं करता, यह केवल एक कमांड है, एक अपडेट में सहवास करने के लिए अतिरिक्त कुछ भी नहीं है।

मुझे लगता है कि यह एनीमेशन की इच्छा का एक साइड इफेक्ट है। सबकुछ "स्लाइड" करने के लिए, इसमें सबकुछ प्रस्तुत करना होगा। खेल खत्म।

+0

आपने कैसे निर्धारित किया कि वास्तव में सभी कोशिकाओं का अनुरोध एक बार में किया जा रहा है? क्या कोई भी खाली नहीं किया जा रहा है? – Pascal

+0

मैंने एक छोटी परीक्षा परियोजना बनाई है और जो व्यवहार आप देख रहे हैं उसे पुन: पेश कर सकते हैं। यह वास्तव में उत्सुक है।अगर आप UITableViewRowAnimationNone निर्दिष्ट करते हैं तो व्यवहार अकेले नहीं हो सकता है। समस्या तब नहीं होती है जब सम्मिलित स्थान स्क्रीन पर सम्मिलित होने पर स्क्रीन पर नहीं है: क्रियाएँ: पंक्तिवृत्त: कहा जाता है। –

उत्तर

6

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

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

नीचे एक उदाहरण है (कोरडाटा आधारित ऐप से) जो कि बिंदु का बिंदु प्राप्त करना चाहिए। चूंकि आपके पास एक NSFetchedResultsController के बजाय एक कस्टम मॉडल है, इसलिए आपको सिस्टम द्वारा दिए गए स्थिरांकों के समूह की जांच करने के बजाय आपको किस प्रकार की कार्रवाई चल रही है, उसे समझना होगा।

//Calculate what needs to be changed  

[self.tableView beginUpdates]; 

for (i = 0 i < changeCount; i++) { 
    type = changes[i]; 

    switch(type) { 
    case NSFetchedResultsChangeInsert: 
     [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] 
        withRowAnimation:UITableViewRowAnimationFade]; 
     break; 

    case NSFetchedResultsChangeDelete: 
     [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] 
        withRowAnimation:UITableViewRowAnimationFade]; 
     break; 
    } 
} 

switch(type) { 

    case NSFetchedResultsChangeInsert: 
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] 
          withRowAnimation:UITableViewRowAnimationFade]; 
    break; 

    case NSFetchedResultsChangeDelete: 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
          withRowAnimation:UITableViewRowAnimationFade]; 
    break; 

    case NSFetchedResultsChangeUpdate: 
    [self configureCell:(id)[tableView cellForRowAtIndexPath:indexPath] 
      atIndexPath:indexPath]; 
    break; 

    case NSFetchedResultsChangeMove: 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
          withRowAnimation:UITableViewRowAnimationFade]; 
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] 
        withRowAnimation:UITableViewRowAnimationFade]; 
    break; 
    } 
} 

[self.tableView endUpdates]; 
+0

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

+0

नहीं, इसकी अपेक्षा की जाती है, और आपको शुरुआती अपडेट की आवश्यकता क्यों है/एंडअपडेट्स कॉल जो आप कर रहे हैं उसे लपेटते हैं। उन लोगों के बिना टेबलव्यू को यह मानना ​​है कि आपके द्वारा किए गए प्रत्येक संशोधन के बाद प्रदर्शन पर असर पड़ सकता है, जिसका अर्थ है कि यह सभी वर्गों से पूछताछ करने के लिए है कि कौन सी कोशिकाएं दिखाई दे रही हैं, और फिर उन सभी को प्राप्त करें। जब आप प्रारंभ करते हैं तो तालिका अद्यतन करता है जब तक आप endUpdates को कॉल नहीं करते हैं, तब तक अपडेट करना बंद हो जाता है, जिस बिंदु पर यह आपके सभी मध्यस्थ राज्यों से पूछताछ के साथ एक ही समय में ऐसा कर सकता है। –

+0

"आपके मध्यस्थ राज्यों से पूछे बिना," मुझे और कॉफ़ी चाहिए –