iPhone:如何从网址获取UIImage?

phi*_*reo 15 iphone image objective-c uiimage

你如何下载图像并将其转换为UIImage?

phi*_*reo 39

NSURL *url = [NSURL URLWithString:@"http://example.com/image.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [[[UIImage alloc] initWithData:data] autorelease];
Run Code Online (Sandbox Code Playgroud)

但是,这不是异步的.


Mat*_*ong 15

您应该记住,使用您在自己的答案中提供的示例代码加载图像数据将阻止主线程,直到下载完成.这是禁忌的可用性.您应用的用户会认为您的应用没有响应.如果要下载图像,请更喜欢NSURLConnection在其自己的线程中异步下载.

阅读有关使用NSURLConnection进行异步下载的Apple文档.

下载完成后,您可以从数据对象中实例化UIImage:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    if (requestData)
    {
        self.image = [[[UIImage alloc] initWithData:requestData] autorelease];
    }
}
Run Code Online (Sandbox Code Playgroud)

requestDataimage是你含类的实例变量,image是一个保留的财产.一定要imagedealloc课程中释放,例如使用self.image=nil;.

  • 这是绝对必须的.下面是一些使用块处理异步UIImage加载和缓存的类.http://t.co/ovOn86KG (2认同)

Riv*_*era 5

确实,异步加载是必须的,但如果您只需要一个简单的解决方案,也可以通过后台调用实现.

[self performSelectorInBackground:@selector(loadImage) withObject:nil];

- (void)loadImage
{
   NSURL * url = [NSURL URLWithString:@"http://.../....jpg"];
   NSData * data = [NSData dataWithContentsOfURL:url];
   UIImage * image = [UIImage imageWithData:data];
   if (image)
   {
       // Success use the image
       ...
   }
   else
   {
       // Failed (load an error image?)
       ...
   }
}   
Run Code Online (Sandbox Code Playgroud)


sup*_*cio 5

您可以从 URL 加载图像,UIImageView而无需阻塞 UI 线程,只需使用dispatch_async

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSURL *url = [NSURL URLWithString:myURL];
            NSData *data = [NSData dataWithContentsOfURL:url];
            UIImage* image = [[UIImage alloc]initWithData:data];

            dispatch_async(dispatch_get_main_queue(), ^{
                [myImageView setImage:image];
            });
        });
Run Code Online (Sandbox Code Playgroud)

第一个dispatch_async用于在后台从 URL 加载图像(不阻塞 UI)。第二个dispatch_async用于实际注入刚刚加载到UIImageView. 请注意,第二个dispatch_async设计用于在主线程(UI 线程)上工作,实际上,该线程用于更新 UI。