Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何提高从url加载图像的性能_Objective C_Xcode - Fatal编程技术网

Objective c 如何提高从url加载图像的性能

Objective c 如何提高从url加载图像的性能,objective-c,xcode,Objective C,Xcode,我正在从url加载图像并在imageView中显示它。我正在使用NSBLockOperation加载图像,它在后台运行,在imageView中加载图像需要时间。是否有任何方法可以提高性能以减少时间。下面是代码 NSOperationQueue *queue=[[NSOperationQueue alloc]init]; NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{ [activityIn

我正在从url加载图像并在imageView中显示它。我正在使用NSBLockOperation加载图像,它在后台运行,在imageView中加载图像需要时间。是否有任何方法可以提高性能以减少时间。下面是代码

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");
    }