2012-05-15 27 views
6

मेरे पास UITableView है। tableView:cellForRow:atIndexPath: विधि (जब डेटा कोशिकाओं में पॉप्युलेट हो जाता है) में मैंने कुछ प्रकार की आलसी लोडिंग लागू की है। यदि rowDataNSDictionary में कुंजी (कुंजी == पंक्ति संख्या) के लिए कोई ऑब्जेक्ट नहीं है, तो प्रोग्राम पृष्ठभूमि में requestDataForRow: विधि लॉन्च करता है। इसलिए सेल दिखाई देने के बाद कोशिकाओं में डेटा थोड़ा सा हो जाता है।UITableView आलसी लोडिंग अनुकूलन

static int requestCounter=0; 

-(void)requestDataForRow:(NSNumber *)rowIndex 
{ 
    requestCounter++; 
    //NSLog(@"requestDataForRow: %i", [rowIndex intValue]); 
    PipeListHeavyCellData *cellData=[Database pipeListHeavyCellDataWithJobID:self.jobID andDatabaseIndex:rowIndex]; 
    [rowData setObject:cellData forKey:[NSString stringWithFormat:@"%i", [rowIndex intValue]]]; 
    requestCounter--; 

    NSLog(@"cellData.number: %@", cellData.number); 

    if (requestCounter==0) 
    { 
     //NSLog(@"reloading pipe table view..."); 
     [self.pipeTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 
    }; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *MyIdentifier = @"pipeCellIdentifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 
    [[NSBundle mainBundle] loadNibNamed:@"PipesForJobCell" owner:self options:nil]; 
    cell = pipeCell; 
    self.pipeCell = nil; 


    PipeListHeavyCellData *cellData=[[PipeListHeavyCellData alloc] init]; 

    if ([rowData objectForKey:[NSString stringWithFormat:@"%i", indexPath.row]]==nil) 
    { 
     //NSLog(@"  nil data for row: %i", indexPath.row); 
     [self performSelectorInBackground:@selector(requestDataForRow:) withObject:[NSNumber numberWithInt:indexPath.row]]; 
    } 
    else 
    { 
     //NSLog(@"  has data for row: %i", indexPath.row); 
     PipeListHeavyCellData *heavyData=[[PipeListHeavyCellData alloc] init]; 
     heavyData=(PipeListHeavyCellData *)[rowData objectForKey:[NSString stringWithFormat:@"%i", indexPath.row]]; 
     cellData._id=[heavyData._id copy]; 
     cellData.number=[heavyData.number copy]; 
     cellData.status=[heavyData.status copy]; 
}; 

इस कोड काम करता है, सब कुछ, ठीक है लेकिन मेरी मेज 2000 पंक्तियां है और सूचकांक 10 के साथ सेल से उपयोगकर्ताओं को स्क्रॉल बहुत जल्दी सूचकांक 2000 के साथ सेल हैं: कोड यह रहा। जब तक सभी खींचने वाले डेटा अनुरोध पूर्ण नहीं होते हैं, तब तक उन्हें लंबे समय तक इंतजार करना होगा (पंक्तियों 11, 12, 13, ..., 2000 के लिए) क्योंकि उपयोगकर्ता तालिका दृश्य को स्क्रॉल करते समय पंक्तियां दिखाई दे रही थीं इसलिए विधि requestDataForRow उनके लिए बुलाया गया था।

मैं उन चीज़ों को कैसे अनुकूलित कर सकता हूं?

+1

यहां कई बहुत अच्छे समाधान (कोड के साथ) के साथ एक ही समस्या के साथ एक अच्छा सवाल है: http://stackoverflow.com/q/7567827/937822 – lnafziger

उत्तर

4

मुझे कुछ ऐसा करना पड़ा। आपको एक कतार बनाने की आवश्यकता होगी जो सबसे हाल ही में जोड़े गए आइटमों को पहले संसाधित करता है।

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

वास्तव में इसे लागू करने का एक आसान तरीका [tableView indexPathsForVisibleRows] का उपयोग करना है।

+0

धन्यवाद, मेरे विचार समान हैं। – user1385666

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