2009-05-31 7 views
45

J'essaie d'obtenir une image à partir d'une URL et cela ne semble pas fonctionner pour moi. Quelqu'un peut me diriger dans la bonne direction?Obtenir une image à partir de l'URL Objectif C

Voici mon code:

NSURL *url = [NSURL URLWithString:@"http://myurl/mypic.jpg"]; 

NSString *newIMAGE = [[NSString alloc] initWithContentsOfURL:url 
             encoding:NSUTF8StringEncoding error:nil]; 

cell.image = [UIImage imageNamed:newIMAGE]; 

Lorsque je déboguer la chaîne NewImage est nul si quelque chose ne fonctionne pas là-bas.

Répondre

148

Qu'est-ce que vous voulez est d'obtenir les données d'image, puis initialiser une UIImage utilisant ces données:

NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic.jpg"]]; 
cell.image = [UIImage imageWithData: imageData]; 
[imageData release]; 

Comme demandé, voici une version asynchrone:

dispatch_async(dispatch_get_global_queue(0,0), ^{ 
    NSData * data = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic.jpg"]]; 
    if (data == nil) 
     return; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // WARNING: is the cell still using the same data by this point?? 
     cell.image = [UIImage imageWithData: data]; 
    }); 
    [data release]; 
}); 
+0

Merci. Cela a fonctionné – TheGambler

+1

c'est synchrone, pouvez-vous s'il vous plaît ajouter un code pour le télécharger en arrière-plan, car, il bloque le thread ui – Houcine

+1

Un couple de problèmes: 1. Vous avez un commentaire à propos de s'assurer que la cellule est encore visible. Vous faites cela avec 'UITableViewCell * updateCell = [tableView cellForRowAtIndexPath: chemin d'index];' suivi de 'if (updateCell) ...' (et évidemment, utilisez ce 'updateCell' plutôt que l'original' cell' pour votre mise à jour de ' 2. Assurez-vous, si vous le faites de manière asynchrone, d'initialiser la propriété 'image' pour votre imageView avant d'initier le processus de récupération asynchrone: 3. Vous devriez vraiment faire de la mise en cache, pour ne pas avoir à re-récupérer – Rob

4

Ok, il y a deux ou trois choses mal ici:

  1. La conversion d'URL (URL) à NSString (newImage) est incorrect, ce que le code ne fait il est essayer de charger le contenu de "http://myurl/mypic.jpg "dans le NSString.

  2. La méthode -imageNamed prend une chaîne qui est un chemin d'accès d'un fichier local, pas une URL en tant qu'argument.

Vous devez utiliser un objet NSData d'intermédiaire, comme dans cet exemple: http://blogs.oreilly.com/digitalmedia/2008/02/creating-an-uiimage-from-a-url.html

3

la réponse acceptée version asynchrone a travaillé très lentement dans mon code. une approche utilisant NSOperation a travaillé des années-lumière plus rapidement. le code fourni par Joe Masilotti ->objective - C : Loading image from URL? (et collé ci-dessous):

-(void) someMethod { 
    // set placeholder image 
    UIImage* memberPhoto = [UIImage imageNamed:@"place_holder_image.png"]; 

    // retrieve image for cell in using NSOperation 
    NSURL *url = [NSURL URLWithString:group.photo_link[indexPath.row]]; 
    [self loadImage:url]; 
} 

- (void)loadImage:(NSURL *)imageURL 
{ 
    NSOperationQueue *queue = [NSOperationQueue new]; 
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] 
             initWithTarget:self 
             selector:@selector(requestRemoteImage:) 
             object:imageURL]; 
    [queue addOperation:operation]; 
} 

- (void)requestRemoteImage:(NSURL *)imageURL 
{ 
    NSData *imageData = [[NSData alloc] initWithContentsOfURL:imageURL]; 
    UIImage *image = [[UIImage alloc] initWithData:imageData]; 

    [self performSelectorOnMainThread:@selector(placeImageInUI:) withObject:image waitUntilDone:YES]; 
} 

- (void)placeImageInUI:(UIImage *)image 
{ 
    [self.memberPhotoImage setImage:image]; 
} 
0

En Swift 3 et 4

let theURL = URL(string:"https://exampleURL.com") 
let imagedData = NSData(contentsOf: theURL!)! 
let theImage = UIImage(data: imagedData as Data) 
cell.theImageView.image = theImage 

Cela se fera dans le thread principal.

Et pour effectuer la même dans fil asynchrone/fond

DispatchQueue.main.async(){ 
     let theURL = URL(string:"https://exampleURL.com") 
     let imagedData = NSData(contentsOf: theURL!)! 
     let theImage = UIImage(data: imagedData as Data) 
    } 
    cell.theImageView.image = theImage