user1268938
user1268938

Reputation: 55

unable to display image using SDWebImage

Newbie to iPhone here. I have an image to display fetched from a rss feed. I'm currently using the code below which works but slows down loading elements in the view:

  for(int i=0; i<[bannerArray count]; i++){

       NSString *bannerImagestr = [[bannerArray objectAtIndex:i] BannerImage];
       bannerImagestr  = [ bannerImagestr  stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

      NSURL *banURL= [NSURL URLWithString:bannerImagestr];



       NSData *data = [NSData dataWithContentsOfURL:banURL];

       imgEventDetail = [[[UIImage alloc] initWithData:data] autorelease];


       [banEventDetailArray addObject:imgEventDetail];

 }NSLog(@"the  banEventDetailArray is %@",banEventDetailArray);

I tried the SDWebImage api to make it load quick but i'm failing to get the image. The code which i've been using is below:

   for(int i=0; i<[bannerArray count]; i++){

       NSString *bannerImagestr = [[bannerArray objectAtIndex:i] BannerImage];
       bannerImagestr  = [ bannerImagestr  stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

      NSURL *banURL= [NSURL URLWithString:bannerImagestr];


       [banIconImage setImageWithURL:banURL placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

      banImg=banIconImage.image;//<<<-------- updated here banImg is an instance of UIImage

       [banEventDetailArray addObject:banImg];

 }NSLog(@"the  banEventDetailArray is %@",banEventDetailArray);

I need the banEventDetailArray in the form of UIImage, because I'm setting this array in the below code which takes (UIImage *) as its parameter

 [eventsdetailroundedButtonType setBackgroundImage:[banEventDetailArray objectAtIndex:numTimerTicks] forState:UIControlStateNormal];

Please help me find what I've been missing out and where I may have gone wrong.

Thanks in advance.

UPDATE: i've replaced a line in the second code block. i.e. banImg=banIconImage.image; at line number 11.

Upvotes: 1

Views: 1398

Answers (4)

kokemomuke
kokemomuke

Reputation: 644

You can use your image URL as key to find the cached image:

UIImage *myCachedImage = [[SDImageCache sharedImageCache] imageFromKey:[NSString \
stringWithFormat:@"%@",banURL]];

Upvotes: 1

user523234
user523234

Reputation: 14834

Your array does not hold image object. Instead it hold pointers (references) to UIImage objects. If you look at your working code, there you have:

imgEventDetail = [[[UIImage alloc] initWithData:data] autorelease];

[banEventDetailArray addObject:imgEventDetail];

You create and add new instance of imgEventDetail UIImage object with data and then add it to the array. You would need to do the same for your bottom (not working) code.

Try this in the not working code:

 [banEventDetailArray addObject:banIconImage.image];  // array automatically retains.

All assuming that your images are downloaded correctly using SDWebImage API.

Upvotes: 0

skram
skram

Reputation: 5314

Why are you setting the image twice? Doesn't make sense.

 [banIconImage setImageWithURL:banURL placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

              banImg=[[UIImage alloc]init];
   [banIconImage setImage:banImg];

Try removing the second setting, should just be.

     [banIconImage setImageWithURL:banURL placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

EDIT: Logic still doesn't make sense. You're probably trying add the UIImageView's image as an object in the array, which means your code should probably look like this.

NSString *bannerImagestr = [[bannerArray objectAtIndex:i] BannerImage];
bannerImagestr  = [ bannerImagestr  stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

NSURL *banURL= [NSURL URLWithString:bannerImagestr];
[banIconImage setImageWithURL:banURL placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

[banEventDetailArray addObject:banIconImage.image];

Try the code before you decide it's not what you need, apparently you don't exactly know what you want. If this is the answer to your question, mark it as the solution.

Upvotes: 0

sergio
sergio

Reputation: 69027

I guess the problem is in this lines:

   [banIconImage setImageWithURL:banURL placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

   banImg=[[UIImage alloc]init];         // <-- here: empty image
   [banIconImage setImage:banImg];       // <-- here: overriding banURL image

since you are:

  1. first, getting the image from the URL;

  2. overriding that image with an empty one.

Use this code, instead:

   [banIconImage setImageWithURL:banURL placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
   [banEventDetailArray addObject:banIconImage];

i.e., you add the image your retrieve to the array and then use it later.

You need to keep track of the UIImageView because it is where the SDWebImage magics happens. Indeed, that view handles the displays of the placeholder while the image is fetched; when the image is there, it is replaced.

You can get the image property only after the actual image is fetched, otherwise you will only get the placeholder.

Upvotes: 0

Related Questions