본문

HJCache : 이미지 비동기 로딩 및 캐시를 위한 iOS 라이브러리 [#1 소개]

HJCache는 비동기적으로 이미지를 불러와서, 부드럽게 스크롤링되는 테이블에 이미지를 입혀주고, 그 이미지들을 파일의 형태로 캐싱하는것을 도와주는 iOS 라이브러리 입니다. 인터넷에서 많은양의 이미즈를 불러오는, 트위터의 트윗 혹은 페이스북의 포스팅등을 출력하는 앱을 생각해 보세요. 

이러한 앱의 경우, 개발자는 다음과 같은 기능이 필요할 수 있습니다.
  • 그림을 비동기적으로 불러옴으로서 UI에 영향을 미치지 않도록 할것입니다.
  • 또한 파일형태의 캐시를 사용함으로서(캐시는 크기를 줄여서 저장할 수도 있습니다.) 다음에 앱이 다시 실행될 때 빠른속도로 다시 불러올 수 있도록 합니다
  • 그리고 동일한 어플내에서 이미지가 공유되고 (예를들어 같은 사람이 작성한 포스팅을 나열할때 그의 프로필 이미지가 한번만 로딩이 되는) UIImage마저 공유가 됩니다.
  • 다운로드중 중단된 다운로드는 깨진 이미지로 저장되지 않습니다.
  • 하나의 객체가 여러 위치에서 사용되더라도, 평범한 메모리 관리만으로도 작업이 가능합니다.
  • 현재 보여지는 이미지에 대해서 네트워크의 사용을 제한합니다, 만약 사용자가 많은 이미지가 들어있는 테이블을 스크롤 할 경우, 지난번에 사용자가 스크롤 했으며, 현재 스크린에 위치하지 않은 이미지는 다시 불러질 필요가 없습니다.
  • 몇가지 경우에 대해서는 이미지가 캐시에 저장되는것을 중단하지 않고 계속 진행합니다. 왜냐하면 지금현재에는 뷰가 제거되었다고 해도 사용자는 다시 그 화면을 다시 불러올 수 있기(뒤로가기) 떄문입니다.
  • 가끔 이미지가 사용되기 전에 미리 불러와져야 할 경우가 있습니다.(사진앨범을 훓어볼떄를 위해) 

HJCache는 위에 있는 모든 사항과 더 많은 것들을 구현해놓았습니다(HJCache는 처음에는 HJ Object Manager라고 지칭되었는데, 위 둘은 동일하며, 안에있던 클래스명도 바뀌지 않았습니다)

HJCache는 앱의 유/무료에 상관없이 무료로 사용될 수 있습니다. 게다가 2009년부터 다양한 형태로 우리가 만든 상용 iPhone앱에 포함되기도 하였습니다. 예를들어, 우리는 우리가 만든 Focus for Facebook이라는 앱에서 이 라이브러리가 사용되었습니다, HJCache의 기본적인 사항은 블로그에 설명되어 있지만 다소 변경된 사항이 있습니다.

이 라이브러리의 목표는 다음과 같습니다 :
  • iOS 앱에서 이미지를 비동기적으로 불러오는 작업을 쉽게 하기
  • 공유된 파일 캐시의 사용을 쉽게하기
  • Cocoa 표준에 따라 메모리 관리하기
  • 보편적인 이미지 출력을 지원하기(트윗의 목록을 출력하여 스크롤링하기, 트위터 프로파일 사진 출력하기, 인터넷을 통해서 포토앨범을 훓어볼 수 있도록 하기등등)
  • 이 라이브러리를 다른종류의 데이터를 위해 사용될 수 있도록 하기

HJCache의 사용방법
시작하기 위해, 앱 초기화 단계에서 HJObjManager인스턴스를 만들고, 만약 파일 캐싱을 사용하기 원한다면 HJMOFileCache의 인스턴스도 만듭니다.
objMan = [[HJObjManager alloc] init];
//만약 전체회면 이미지들을 사용한다면, 더 작은 메모리 캐시 사이즈를 사용하십시오.
//objMan = [[HJObjManager alloc] initWithLoadingBufferSize:2 memCacheSize:2]];
 
NSString* cacheDirectory = [NSHomeDirectory() stringByAppendingString:@"/Library/Caches/imgcache/flickr/"] ;
HJMOFileCache* fileCache = [[[HJMOFileCache alloc] initWithRootPath:cacheDirectory] autorelease];
objMan.fileCache = fileCache;

HJManagedImageV 는 UIView의 서브클래스로서, 클래스에 의해 관리될 이미지를 보여주는데 사용됩니다. 여기서 관리될 이미지란, URL을 통해서 비동기적으로 불러오거나, UIImage 객체를 공유하거나, 파일형태로 캐싱을 원한다는 의미입니다.
이는 Interface Builder를 포함하여, UIImageView가 사용될 어디에서든 HJManagedImageV 인스턴스를 사용할 수 있습니다. 관리되는 이미지를 불러오거나 보여주기 위해서는 이미지의 URL을 지정한 후 객체 관리자에게 이 이미지를 관리해달라고 요청해야 합니다.
 
managedImage.url = imageUrlForCurrentRow;
[self.objectManager manage:managedImage];
//이 라이브러리는 메인 스레드에서 사용되는것을 권장합니다. 그러므로 만약 위 코드가 메인스레드상에서 동작하지 않는다면 대신 다음을 사용하십시오.
//[self.objectManager performSelectorOnMainThread:@selector(manage:) withObject:managedImage waitUntilDone:YES];

이것이 해야할 전부입니다. 객체 관리자는 공유되는  UIImage객체가 사용되는 뷰를 계속 감시하고, 다른 일반적인 UIView와같이 이미지 객체의 메모리 관리를 함으로서, 객체 관리자는 스크린에서 더이상 사용되지 않으면 이를 메모리에서 제거하고, 아니면 일정한 수의 UIImage를 재사용을 휘하여 메모리에 저장하거나, 혹은 파일의 형태로 이미지를 캐시합니다. 

알아둘것은 HJManagedImageV는 HJCache를 사용한다는 것입니다. 이 클래스에는 하나의 객체가 있으며, 이는 객체 관리자에 의해서 관리됩니다. 이 HJManagedImageV클래스는 모든 앱과 모든 상황을 위해 설계된 클래스가 아닙니다. 만약 이 클래스에 원하는 기능이 존재하지 않는다면, HJManagedImageV와 헤더파일에 있는 문서를 참고하여 서브클래싱을 하여 수정하시거나, 커스터마이징을 하십시오. HJCache는 이미지에만 쓰이는것이 아닙니다. 다시 말하지만, 매우 간단한 HJManagedImageV클래스를 한번 분석해보고 객체의 관리를 휘한 자신만의 클래스를 어떻게 만들까에 대해서 생각해보십시오. 이 라이브러리를 위한 대부분의 노력은 HJObjManager와 핸들러, 그리고 파일캐시에 투자되었으며, 이것들은 이것이 다루고 있는 객체에 대해 추상적으로 접근합니다. 그러므로 HJManagedImageV 를 당신이 원하는대로 바꾸는데에 대해 겁먹을 필요는 없습니다. 

HJCache는 github(https://github.com/markofjohnson/HJCache)에 올려놓았습니다. 배포판에는 매우 간단한 몇몇 데모 앱도 포함해놓았습니다. (UITableViewCell의 커스터마이징이 완벽하지 않기 떄문에, 이 앱들을 테이블에 이미지를 넣는 방법에 대해 학습하기 위한 사용은 권장하지 않습니다. 이 라이브러리를 어떻게 사용해야 하는가에대해 배우는 용도로 사용하세요)

참고로 이 라이브러리는 테이블에 이미지를 동적으로 로드하는 것 뿐만 아니라, 다양한 종류의 뷰에 이미지를 넣는것, 그리고 이미지가 아닌 데이터에 이 클래스를 어떻게 적용하는 예제를 보여줍니다. 



=================
UITableViewCell을 커스터마이징 하기 위해 자료를 찾던중 우연찮게 발견한 라이브러리이다. 인터넷에서 그림을 불러올 경우 대개 캐싱을 생각하긴 하지만 번거롭기도 하고 해서 대충 넘어가려고 했는데 오늘 인터넷망의 문제를 통해서 캐싱이 어느정도 유용하게 사용될 수 있다 생각이 된다. 역시나 쓰여있는대로 캐싱과 객체 관리에 초점이 맞춰져있는 라이브러리이므로 분석을 통해서 편의성 뿐만 아니라 최적화의 기술을 익히는 데 도움이 될거라 생각한다. 다음 포스팅은 각 클래스에 대한 설명과 이것들을 어떻게 사용할것인가에 대한 예제도 함께 기술할 생각이다. 전에 UITableViewCell 커스터마이징에 대해서 자세하게 분석을 해놓았었는데 그거랑 연동해서 글을 작성하면 좋을것같다. 

 

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.