2013-06-20 1 views
0

나는 Parse.com을 사용하여 iOS 앱을 만들었습니다.이미지 로딩 문제를 개선하는 방법. 어떤 캐시 같은 솔루션이 있습니까

내 앱에서 네트워크의 많은 데이터를 표시했습니다.

데이터를 빠르게로드하려면 캐시 kPFCachePolicyCacheThenNetwork을 사용했습니다. 데이터를 잘로드하지만 스크롤하는 동안 이미지를로드하는 데 어느 정도 시간이 걸립니다.

첫 번째 흰색 이미지와 이미지로드.

Is there any solution like cache to display images in imageviews with out interruption.

감사합니다.

+0

당신은 –

+0

사용 afnetworking +있는 UIImageView 카테고리의 좋은 – amar

답변

1

나는 gcd의 도움으로 코드를 작성하고, 단지 imageView의 객체를 전달하고 url을 전달해야한다. 캐시와 같은 모든 것을 관리한다.

-(void)downloadingServerImageFromUrl:(UIImageView*)imgView AndUrl:(NSString*)strUrl{ 


strUrl = [strUrl encodeUrl]; 

NSString* theFileName = [NSString stringWithFormat:@"%@.png",[[strUrl lastPathComponent] stringByDeletingPathExtension]]; 


NSFileManager *fileManager =[NSFileManager defaultManager]; 

NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",theFileName]]; 



imgView.backgroundColor = [UIColor darkGrayColor]; 
UIActivityIndicatorView *actView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
[imgView addSubview:actView]; 
[actView startAnimating]; 

CGSize boundsSize = imgView.bounds.size; 
CGRect frameToCenter = actView.frame; 
// center horizontally 
if (frameToCenter.size.width < boundsSize.width) 
frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width)/2; 
else 
frameToCenter.origin.x = 0; 




// center vertically 
if (frameToCenter.size.height < boundsSize.height) 
frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height)/2; 
else 
frameToCenter.origin.y = 0; 

actView.frame = frameToCenter; 



dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue, ^{ 

NSData *dataFromFile = nil; 
NSData *dataFromUrl = nil; 

dataFromFile = [fileManager contentsAtPath:fileName]; 
if(dataFromFile==nil){ 
    dataFromUrl=[[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strUrl]] autorelease];      
} 

dispatch_sync(dispatch_get_main_queue(), ^{ 

    if(dataFromFile!=nil){ 
     imgView.image = [UIImage imageWithData:dataFromFile]; 
    }else if(dataFromUrl!=nil){ 
     imgView.image = [UIImage imageWithData:dataFromUrl]; 
     NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",theFileName]]; 

     BOOL filecreationSuccess = [fileManager createFileAtPath:fileName contents:dataFromUrl attributes:nil];  
     if(filecreationSuccess == NO){ 
      NSLog(@"Failed to create the html file"); 
     } 

    }else{ 
     imgView.image = [UIImage imageNamed:@"NO_Image.png"]; 
    } 
    [actView removeFromSuperview]; 
    [actView release]; 
    [imgView setBackgroundColor:[UIColor clearColor]]; 
}); 
}); 

}

+0

strUrl = [strUrl encodeUrl]; .. NSString declare selector 'encodeURL' – user2492409

+0

죄송합니다. 인코딩 문자열을 변환 할 카테고리를 사용 했으므로 URL 문자열에서 공백을 제거 할 수 있습니다. – SachinVsSachin

0

다음은 백그라운드에서 이미지를로드하기위한 코드입니다. 이것을 확인하십시오 Code

+0

PLS 링크가 만료 된 경우 ANS는 쓸모가됩니다 becoz 몇 가지 세부 사항을 제공하려고 실제로 모두'NSCache' 기반 캐시를 제공하는'SDWebImage'에 대한 – amar

3

이렇게하려면 SDWebImage을 사용할 수 있습니다.

캐싱 목적으로 NSCache을 사용할 수도 있습니다.

+2

일뿐만 아니라 SDWebimage 라이브러리를 사용할 수 있습니다 영구 저장소 캐시. 누군가 이미 AFNetworking을 사용하고 있다면'UIImageView' 카테고리도 나쁘지는 않지만, 필요한 모든 것이 이미지를위한 캐시라면'SDWebImage'는 몇 가지 추가 기능을 제공한다고 생각합니다. – Rob

2

예는 AFNetworking있는 UIImageView 범주를 사용할 수 있습니다 당신은 당신이 또한 기존 이미지를 편집 한 후 그

을 manipulagting에 의해, 같은 URL에서 그것을 dwnload 경우 일반적으로 필요한 특정 이미지의 캐싱을 사용하지 않도록 설정할 수 있습니다

를 분류되어 있습니다 이 blog

에서 언급 한 바와 같이

-(void)setImageWithURL:(NSURL *)url 
     placeholderImage:(UIImage *)placeholderImage 

타 옵션은 캐시를 새로 고치 시설과 ASImageView 수 있습니다.

0

당신은 이미지의 게으른 로딩 EGOImageLoading (EGOImageLoading)를 사용해야하며, NSUserDefaults를 사용하여 이미지를 저장할 수 있습니다.

많은 프로젝트에서 사용하는 것이 가장 좋은 방법입니다.

0

미안하지만, Parse는 이미 이러한 모든 작업을 수행하고 있습니다. 구문 분석은 AFNetworking을 사용하여 이미지를 가져 와서 NSCache에 넣고 디스크 캐싱을 매우 적극적으로 사용하여 중복 된 네트워크 트립을 완벽하게 방지합니다 (버전은 URL의 일부이므로 Parse는 if-modified - GET 이후).

발생할 수있는 가장 큰 문제는 한 번에 3 개의 이미지 만 다운로드하도록 PFFile이 다운로드를 조절한다는 것입니다. 실험 후 이것은 사용자에게 점진적인 피드백을 보장하고 너무 많은 스레드 이후에 일부 iOS 장치가 성능이 매우 떨어지는 고약한 문제를 피하기 때문에 최고의 숫자였습니다. 가능하다면 내가 제공 할 수있는 최선의 조언은 일부 이미지를 미리 가져 오는 것입니다. 앞서 언급했듯이 PFFile 이미지는 매우 적극적으로 캐시됩니다. kPFCache 정책 ...물건은 부패 될 수있는 검색어에만 영향을줍니다. 해당 쿼리가 가리키는 이미지는 항상 캐시됩니다 (처음에는 요청시에만 다운로드 됨).

관련 문제