从URL获取图像Objective C
我试图从URL中获取图片,但似乎没有为我工作。 有人能指出我正确的方向吗?
这是我的代码:
NSURL *url = [NSURL URLWithString:@"http://myurl/mypic.jpg"]; NSString *newIMAGE = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; cell.image = [UIImage imageNamed:newIMAGE];
当我debuggingnewIMAGEstring是零,所以有些东西不工作在那里。
你想要的是获取图像数据,然后使用该数据初始化UIImage:
NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic.jpg"]]; cell.image = [UIImage imageWithData: imageData]; [imageData release];
按要求,这是一个asynchronous版本:
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]; });
好的,这里有一些错误:
-
从URL(url)到NSString(newImage)的转换是不正确的,代码实际做的是尝试将“ http://myurl/mypic.jpg ”的内容加载到NSString中。
-
-imageNamed方法接受一个string,它是本地文件的path,而不是URL作为参数。
您需要使用NSData对象作为中介,如下例所示: http : //blogs.oreilly.com/digitalmedia/2008/02/creating-an-uiimage-from-a-url.html
接受的答案asynchronous版本在我的代码中工作非常缓慢。 一个使用NSOperation的方法工作起来更快。 由Joe Masilotti提供的代码 – > 目标 – C:从URL加载图像? (并粘贴在下面):
-(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]; }
在Swift 3和4中
let theURL = URL(string:"https://exampleURL.com") let imagedData = NSData(contentsOf: theURL!)! let theImage = UIImage(data: imagedData as Data) cell.theImageView.image = theImage
这将在主线程中完成。
并在asynchronous/后台线程中执行相同的操作
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