UIImageView加载图像需要时间



我想从互联网上的特定链接下载图像下载此图像发生在另一个类中,该类是Singleton类名moreAppInternet.m

我的更多AppInterNet.m文件如下

//finishedImgDling is bool
//mutableData is NSMutableData
//urlConnection is NSURLConnection
//appimage is UIImage
//imageUrl is NSString Containing Link
 +(id)sharedManager
{
    static moreAppInterNet *sharedMyManager = nil;
    @synchronized(self) {
        if (sharedMyManager == nil)
            sharedMyManager = [[self alloc] init];
    }
    return sharedMyManager;
}

-(void)downloadImageFromUrl
{    
    finishedImgDling = NO;
        
    [self.mutableData setLength:0];
    
    self.urlConnection = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.imageUrl]] delegate:self];
    
    
    while(!finishedImgDling) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }   
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    if (connection == self.urlConnection)
    {
        NSLog(@"imageDling");
    }
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    if (connection == self.urlConnection)
    {
        if (self.mutableData == nil)
        {
            self.mutableData = [NSMutableData data];
        }
                
        [self.mutableData appendData:data];
    }
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    if (connection == self.urlConnection)
    {
        NSLog(@"image Downloaded");
        
        finishedImgDling = YES;
                
        [self setUrlConnection:nil];
        
        [self storeImage];
    }
}
-(void)storeImage
{
    [self setAppimage:nil];
    
    self.appimage = [UIImage imageWithData:self.mutableData];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];     
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    NSString *path =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"appImage.png"]];
          
    [fileManager createFileAtPath:path contents:UIImagePNGRepresentation(self.appimage) attributes:nil];
     NSLog(@"downloading and storing complete");
        
}
and my other ViewController is as follow from where I call that function

-(void)viewDidLoad
{
    [moreAppInterNet sharedManager];
    [self downloadImage];
}
-(void)downloadImage
{
     NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download_Image_from_other_class) object:nil];
        
    NSOperationQueue *que = [[NSOperationQueue alloc] init];
    
    [que addObserver:self forKeyPath:@"operations" options:0 context:NULL];
    
    [que addOperation:operation];
    
    [operation release];
    
    self.dlingQue = que;
    
    [que release];
}
-(void)download_Image_from_other_class
{
    [[moreAppInterNet sharedManager] downloadImageFromUrl];
}
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                         change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"operations"] && object == self.dlingQue)
    {
        if ([self.dlingQue operationCount] == 0)
        {
            self.imgView = [[moreAppInterNet sharedManager] appimage];
            //it takes lots of time to display image in UIImageView
            //Even though Above line get executed
        }
    }
    else {
        [super observeValueForKeyPath:keyPath ofObject:object
                               change:change context:context];
    }
}

问题是self.imgView需要大量的时间来加载图像,大约5秒,即使它已经完全下载。

我用于联网的库是AFNetworking

我认为当您请求时,您的代码会再次下载图像。

您需要检查downloadImageFromUrl中是否有该文件。

也许,您需要更健壮的库来处理文件下载。

最新更新