Objective c 如何提高从url加载图像的性能
我正在从url加载图像并在imageView中显示它。我正在使用NSBLockOperation加载图像,它在后台运行,在imageView中加载图像需要时间。是否有任何方法可以提高性能以减少时间。下面是代码Objective c 如何提高从url加载图像的性能,objective-c,xcode,Objective C,Xcode,我正在从url加载图像并在imageView中显示它。我正在使用NSBLockOperation加载图像,它在后台运行,在imageView中加载图像需要时间。是否有任何方法可以提高性能以减少时间。下面是代码 NSOperationQueue *queue=[[NSOperationQueue alloc]init]; NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{ [activityIn
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
[activityIndicator startAnimating];
NSString *imagefile = [banner1 objectAtIndex:0];
NSURL *url1=[NSURL URLWithString:imagefile];
NSData *data = [NSData dataWithContentsOfURL:url1];
UIImage *ui=[[UIImage alloc]initWithData:data];
bigbanner.image=ui;
[activityIndicator stopAnimating];
bigbanner.alpha=0.0;
}];
[operation setCompletionBlock:^{
[UIView animateWithDuration:3.0 animations:^{bigbanner.alpha=2.0;}
completion:^(BOOL finished){}];
}];
[queue addOperation:operation];
我想你的限制因素是图像下载。 在iOS上加载图像并将其放在屏幕上的速度相当快 除了把你的三秒淡入改成更短的间隔,我想你被卡住了 您可以尝试使用[NSURLRequest]进行下载,但我怀疑您是否会注意到一个主要的区别 我认为你的选择是(按速度顺序排列):
另外:一个旁注,希望其他路过的人能回答这个问题。。。从非主线程设置UIImageView的image属性是否安全?我的印象是,UI上发生的所有事情都应该发生在主线程上。尝试一下ASIHTTPRequest,也许在后台异步加载图像可以提高同时加载多个图像的速度,签出ASINetworkQueue 没有试过,但它在这里:
#import "ASIHTTPRequest.h"
#import "ASINetworkQueue.h"
-(void)loadImages
{
ASINetworkQueue * asiNetworkQueue = [ASINetworkQueue queue];
[asiNetworkQueue setDelegate:self];
[asiNetworkQueue setShouldCancelAllRequestsOnFailure:NO];
for(int i=0; i < 20; i++)
{
NSURL *url = [NSURL URLWithString:@"some_url"];
ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease];
[request setDidFinishSelector:@selector(imageRequestFinished:)];
[request setUserInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:i] forKey:@"id"]];
}
[asiNetworkQueue go];
}
-(void)imageRequestFinished:(ASIHTTPRequest *)request
{
UIImage* image = [UIImage imageWithData:[request responseData]];
//Use the id to match the request with a specific UIImageView
int imageId = [request.userInfo objectForKey:@"id"];
//imageViewArray[imageId].image = image;
}
正如其他人所提到的,如果限制资源是网络速度,那么您所能做的就不多了。如果文件不太大(看起来也不太大),您可以在用户到达页面之前预加载它们。例如,如果只有几个横幅,则可以在应用程序启动时开始加载所有横幅。如果要做的事情太多,你可以尝试做出有根据的猜测——例如,如果用户登陆的屏幕只能引导他找到4个可能的横幅,那么当用户登陆该屏幕时,开始下载所有横幅,为他们做出选择做准备。最后,您应该缓存下载后的横幅,这样您只需支付一次网络访问费用
希望有帮助 它就像dis一样一旦图像被下载了淡入效果occours,它工作得非常好唯一的问题是从url下载图像我会标记我的screenshot@kingston下载图像很慢。通过减少加载的图像数量和图像大小,以及在加载图像时使应用程序具有响应性和实用性,找到解决此问题的方法。@Kenny_Winker通常可以工作,但这是一种不好的做法,因为你不知道UIKit到底在干什么。您可以将设置异步分派到主线程,解压仍应在后台进行。与此相关的问题是,解压图像的速度基本上很慢。您可以强制解压缩以创建缓存版本,但在这种情况下,我知道他希望立即下载、解压缩并显示。希望有人能给出一个更好的答案。顺便说一句,令人惊讶的是,解压远比磁盘访问慢。如果你的iPhone已经在使用网络,可能也会比网络访问慢。我只加载了一个图像(顶部的大横幅)…cud你帮我在上面的代码中实现…感谢againI编辑了答案,以包含一个异步调用的代码。要设置ASIHTTPRequest库,请访问-。祝你好运mkay..如果我使用AsIhtpRequest或NsurlRequest从url加载图像,会有什么不同吗?我已经使用了这两种方法,但没有注意到在速度方面有多大的差异(尽管我没有做任何形式的测试)。ASIHTT功能更丰富,但需要一点新的设置才能使用。您使用哪一个取决于除了URL下载之外您还有什么需要,两者都可以很好地使用。
-(void)loadImage:(NSString*)imagePath
{
//_activityIndicator.hidden = FALSE;
//[_activityIndicator startAnimating];
NSURL*imageURL = [NSURL URLWithString:imagePath];
ASIHTTPRequest* request = [[[ASIHTTPRequest alloc] initWithURL:imageURL] autorelease];
[request setDidFailSelector:@selector(requestDidFailed:)];
[request setDidStartSelector:@selector(requestDidStarted:)];
[request setDidFinishSelector:@selector(requestDidFinished:)];
[request setDelegate:self];
[request startAsynchronous];
}
- (void)requestDidFinished:(ASIHTTPRequest *)request
{
//_activityIndicator.hidden = TRUE;
//[_activityIndicator stopAnimating];
self.imageView.image = [UIImage imageWithData:[request responseData]];
// NSLog(@"image download finished");
}
- (void)requestDidFailed:(ASIHTTPRequest *)request
{
NSError *error = [request error];
//NSLog(@"Loading Image Failed");
//_activityIndicator.hidden = TRUE;
//[_activityIndicator stopAnimating];
}
- (void)requestDidStarted:(ASIHTTPRequest *)request
{
//NSLog(@"image download started");
}