2012-12-13 13 views
7

मैं उद्देश्य-सी के लिए काफी नया हूं इसलिए उम्मीद है कि यह सब समझ में आता है। मैंने सर्वर से छवियां डाउनलोड की हैं और उन्हें collectionView cellForItemAtIndexPath: विधि में छवि दृश्य में प्रदर्शित किया है। जिस मुद्दे का सामना कर रहा हूं वह यह है कि छवियां कैशिंग नहीं लगती हैं। ऐसा लगता है कि हर बार एक सेल का पुन: उपयोग किया जा रहा है, सर्वर से संबंधित छवि फिर से डाउनलोड की जा रही है। प्रलेखन पढ़ने और इसी तरह के सवाल मैंने सोचा था कि इस के जवाब को देख सेएक छवि कैशिंग और UICollectionView

imageDictionary = [[NSMutableDictionary alloc]initWithCapacity:50.0]; 

के साथ निम्न कोड पर्याप्त होगा:

मेरी viewDidLoad विधि में मैं एक NSMutableDictionary बना रहा हूं। मैं इस पर कुछ दिनों से रहा हूं और मुझे पता है कि कुछ ऐसा है जो मुझे याद आ रहा है या एक अवधारणा जिसे मैं समझ नहीं रहा हूं।

#pragma mark - UICollectionView Data Source 
- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section;{ 
    NSLog(@"Begin retrieving photos"); 
    return [self.photos count]; 
} 

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{ 
    return 1; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;{ 
    CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath]; 
    cell.imageView.image = nil; 

    if (cell.imageView.image == nil) { 
    dispatch_queue_t downloadQueue = dispatch_queue_create("image downloader", NULL); 
    dispatch_async(downloadQueue, ^{ 
     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[self.photos objectAtIndex:indexPath.row] objectForKey:@"fullimage"]]]; 
     UIImage *image = [UIImage imageWithData:data]; 
     [imageDictionary setObject:image forKey:@"Image"]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      cell.imageView.image = [imageDictionary objectForKey:@"Image"]; 
      [cell setNeedsDisplay]; 
     }); 
    }); 
    } 
    return cell; 
} 

किसी भी मदद की सराहना की जाएगी। अग्रिम में धन्यवाद।

+2

ऐसा लगता है कि आप हर बार छवि को फिर से लोड कर रहे हैं। संग्रहदृश्य आपके लिए छवियों को कैश नहीं करता है। आपको कैशिंग के लिए अपना खुद का शब्दकोश बनाना होगा। एनएससीएच में देखो। – yuf

+0

@ यूफ करेंगे - धन्यवाद! – BrianS

उत्तर

15

@yuf - दिशा के लिए फिर से धन्यवाद। ऐसा लगता है कि एनएससीएच मुझे बाद में परिणाम प्राप्त कर रहा है। यहां वह कोड है जो ठीक से काम कर रहा है। अगर किसी के पास एक समान समस्या है, तो आप निम्न को मेरे मूल प्रश्न से तुलना कर सकते हैं।

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;{ 
    CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath]; 

    NSString *imageName = [[self.photos objectAtIndex:indexPath.row] objectForKey:@"fullimage"]; 
    UIImage *image = [imageCache objectForKey:imageName]; 

    if(image){ 

     cell.imageView.image = image; 
    } 

    else{ 

    cell.imageView.image = nil; 

    dispatch_queue_t downloadQueue = dispatch_queue_create("image downloader", NULL); 
    dispatch_async(downloadQueue, ^{ 

     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[self.photos objectAtIndex:indexPath.row] objectForKey:@"fullimage"]]]; 
     UIImage *image = [UIImage imageWithData:data]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      cell.imageView.image = image; 

     }); 

     [imageCache setObject:image forKey:imageName]; 
    }); 
    } 

    return cell; 
} 
+5

यह पूरी तरह से सही नहीं है क्योंकि यदि कोशिकाओं को सही ढंग से पुन: उपयोग किया जा रहा है, तब तक छवि संभव है जब छवि लोड हो और सेल अपडेट हो जाए, तो सेल के उस उदाहरण का उपयोग आपके मॉडल में एक और रिकॉर्ड का प्रतिनिधित्व करने के लिए किया जा रहा है। कैश को अपडेट करने के लिए बेहतर है और फिर संग्रह दृश्य पुनः लोड करें ItemsAtIndexPaths: और कैश से छवि सेट करने के लिए cellForItemAtIndexPath प्राप्त करें (यदि यह दिखाई दे रहा है)। – Ants

+0

आह, समझ में आता है। असल में, मैंने उस मुद्दे में भाग लिया (केवल एक बार, लेकिन मुझे लगता है कि आपका क्या मतलब है)। धन्यवाद! – BrianS

+0

@ एंट्स, यदि आप कोड जोड़ सकते हैं, तो बहुत से लोग लाभान्वित होंगे (मेरे साथ)। धन्यवाद। – Satyam

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