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)
凡requestData和image是你含类的实例变量,image是一个保留的财产.一定要image在dealloc课程中释放,例如使用self.image=nil;.
确实,异步加载是必须的,但如果您只需要一个简单的解决方案,也可以通过后台调用实现.
[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)
您可以从 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。