2012-05-06 8 views
10

हम हजारों पंक्तियों या कुछ भी नहीं बोल रहे हैं, हालांकि अगर चीजों को उच्च स्तर तक बढ़ाने का कोई तरीका था, तो मुझे यह पसंद आएगा।UITableView में बड़ी संख्या में पंक्तियों/खंडों को एनिमेट करने से खराब प्रदर्शन

मेरे पास 27 वर्गों और 180 पंक्तियों के साथ एक सारणी है जिसमें सभी वर्गों में फैला हुआ है, और जिस परिदृश्य में मैं वर्तमान में फंस रहा हूं वह यह है कि जब मैं मॉडल मॉडल में चीजों को केवल 3 खंडों और 5 पंक्तियों के साथ एनिमेट करता हूं, और इससे भी बदतर) फिर से वापस।

मैं startUpdates/endUpdates के साथ सभी एनिमेशन बैच कर रहा हूं। मेरा ऐप आईफोन 4 पर 1-2 सेकंड के लिए बहुत अच्छी तरह से लॉक हो जाता है, जबकि यह चीजों को आंकड़ा करता है, फिर एनिमेशन शुरू होता है।

मैंने प्रत्येक पंक्ति को हटाने/जोड़ने के लिए एनिमेट करने और दोनों पंक्तियों को हटाने के मामले में 0 को छोड़ने की कोशिश की है, और केवल अनुभागों को हटाने/सम्मिलित करने के लिए एनिमेट करने की कोशिश की है (जब पंक्ति गणना 0 तक गिर जाएगी)। मैंने माना होगा कि उत्तरार्द्ध बेहतर प्रदर्शन करेगा लेकिन यह चीजों को बिल्कुल नहीं बदलेगा।

क्या ऐसा कुछ भी है जो इसे गति देने के लिए ऐप पर किया जा सकता है? यदि उनमें से 20 से अधिक हैं, तो इसके बजाय मेरे पास केवल पुनः लोड करने का विकल्प चुनने के लिए अलग-अलग एनिमेशन से बाहर निकलने के लिए कोड का एक बड़ा हिस्सा है।

संपादित यहाँ कोड है कि समस्या दर्शाती है। इस कोड का प्रदर्शन बराबर मोनोचच कोड (जो मैं पहले उपयोग कर रहा था) से थोड़ा बेहतर है, लेकिन यह अभी भी बहुत खराब है।

#import "TableViewController.h" 

@interface MyTableViewDataSource : NSObject<UITableViewDataSource> { 
    int rows; 
}; 

@end 

@implementation MyTableViewDataSource 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (void)setRowCount:(int)r 
{ 
    rows = r; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return rows; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (!cell) 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

    cell.textLabel.text = [NSString stringWithFormat:@"row %d", indexPath.row]; 

    return cell; 
} 

@end 

@implementation MyTableViewController { 
    UIBarButtonItem *populateButtonItem; 
}; 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     populateButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Populate" style:UIBarButtonItemStylePlain target:self action:@selector(populateDataSource)]; 
    } 
    return self; 
} 

- (void)populateDataSource 
{ 
    NSMutableArray* new_rows = [[NSMutableArray alloc] init]; 
    [((MyTableViewDataSource*)self.tableView.dataSource) setRowCount:200]; 

    for (int i = 0; i < 200; i ++) 
     [new_rows addObject:[NSIndexPath indexPathForRow:i inSection:0]]; 

    [self.tableView beginUpdates]; 
    [self.tableView insertRowsAtIndexPaths:new_rows withRowAnimation:UITableViewRowAnimationAutomatic]; 
    [self.tableView endUpdates]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.tableView.dataSource = [[MyTableViewDataSource alloc] init]; 
    self.navigationItem.rightBarButtonItem = populateButtonItem; 
} 

@end 
+1

मेरा पहला अनुमान यह होगा कि आपकी टेबल सेल अपराधी हैं। क्या आप कस्टम सेल का उपयोग कर रहे हैं? – lyricsboy

+0

क्या आप कुछ कोड पोस्ट कर सकते हैं? इसके अलावा: क्या आपके UITableViewCells अपारदर्शी हैं? – Ahti

+1

आपके बाधाओं का संकेत देने वाले उपकरण क्या हैं? क्या आप उन्हें एक ही डिलीवरी के साथ बड़े पैमाने पर हटा रहे हैं RowsAtIndexPaths: ... कॉल, या कई व्यक्तिगत कॉल? क्या आप एनिमेशन के बीच में reloadData को कॉल कर रहे हैं (आपको ऐसा कभी नहीं करना चाहिए)? –

उत्तर

3

यह केवल पंक्तियों को दिखाई दे रहे हैं चेतन करने के लिए समझ में आता है। आपके द्वारा डालने वाली सभी पंक्तियों के लिए एनीमेशन करने के बजाय, उन पंक्तियों के सम्मिलन को एनिमेट करने पर विचार करें जो दिखाई देंगे।

साथ ही, क्या आप सुनिश्चित हैं कि यह एनीमेशन है जो देरी का कारण बन रहा है? अगर आप एनीमेशन के लिए UITableViewRowAnimationNone पास करते हैं, या यह तेज़ है तो क्या आपको वही देरी मिलती है? यदि यह तेज़ है, तो फिर, उन प्रविष्टियों को एनिमेट करने से बचें जो दिखाई नहीं देंगे।(आप यह पता लगा सकते हैं कि -indexPathsForVisibleRows का उपयोग करके कौन सी पंक्तियां वर्तमान में दिखाई दे रही हैं।) यदि यह तेज़ नहीं है, तो समस्या शायद एनीमेशन से संबंधित नहीं है, बल्कि एक बार में कुछ सौ पंक्तियों को डालने का ओवरहेड है। पूरी तालिका को फिर से लोड करना जैसा कि आप कर रहे हैं वह एक विकल्प है; छोटे बैचों में पंक्तियों को डालना एक और है।

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

+0

उन पंक्तियों को एनिमेट करने से परहेज करना जो दृश्यमान नहीं होंगे वास्तव में मैं क्या करना चाहता हूं। लेकिन ऐसा लगता है कि indexPathsForVisibleRows मुझे वह नहीं देगा जो मुझे चाहिए - एनीमेशन दृश्य क्षेत्र में भरने की संभावना है, इसलिए वर्तमान में दिखाई देने वाली पंक्तियां उन लोगों को नहीं हैं जिन्हें मैं एनिमेट करना चाहता हूं ... जब तक indexPathsForVisibleRows किसी भी तरह से नहीं ले रहा है खाते में पंक्तियों (और/या अनुभाग) मैं जोड़/हटाना होगा। – toshok

+0

... जो कहा, UITableViewRowAnimationNone पर स्विच करना टिकट था। अभी भी बहुत ही मामूली प्रारंभिक विराम है, शायद ही ध्यान देने योग्य है। तो शायद यह एनिमेशन की संख्या इतनी अधिक नहीं है, लेकिन शायद ज़ेड ऑर्डरिंग (या क्लिपिंग?) कि UITableView कई अन्य enum सदस्यों में गुजरने के दौरान कर रहा है जो मंदी का कारण बन रहा था – toshok

0

तारों की कुछ हार्डकोडेड सरणी के साथ समान कार्यक्षमता का परीक्षण करने का प्रयास करें और समस्या देखें। यदि समस्या अभी भी है, तो इसका मतलब है कि समस्या डेटा के साथ प्रतिपादन के साथ है।

अलग तरह एनीमेशन के पहले से ही बनाया आप कुछ अच्छा एक लाइनर कार्यान्वयन के साथ तेजी से एनिमेशन हो सकता है जहां कुछ कस्टम नियंत्रण कर रहे हैं के लिए: Here एक नजर है।

1

आप का उपयोग कर रहे हैं (संदर्भ: तालिका दृश्य आपके लिए एक उपयुक्त एनीमेशन शैली चुनता है। (आईओएस 5.0 में प्रस्तुत किया गया)), और किसी कारण से, तालिका दृश्य वास्तव में एक बुरा चुनता है, जो सभी में fades उन्हें विस्तार करते समय पंक्तियां। अपने फ्रेम का आकार बदलने और उन्हें चारों ओर ले जाने के दौरान 200 UIViews पर अस्पष्टता बदलना धीमा होना है। :)

तुम बस ऐसा कर सकते हैं:

[self.tableView insertRowsAtIndexPaths:new_rows withRowAnimation:UITableViewRowAnimationNone]; 

इस UITableView के बहुत ही बुनियादी एनीमेशन के लिए एनिमेशन जब पंक्तियाँ, जब कई कि डालने जो, मेरी राय में, बिल्कुल के लिए पर्याप्त है डालने कम हो जाएगा।

+0

yup, वह वास्तव में चाल थी। – toshok

1

आप कस्टम यूआईटीबल व्यूसेल और कस्टम ड्राइंग बनाने की कोशिश कर सकते हैं, इस प्रोजेक्ट को जांचें, ते अनुभाग जो टेबल व्यू और फास्ट सेल के बारे में बात करता है।

http://iosboilerplate.com/#uitableview

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