Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[IDLE-000] 이미지 로딩 최적화 #70

Merged
merged 8 commits into from
Sep 22, 2024
Merged

Conversation

J0onYEong
Copy link
Contributor

변경된 점

  • �이미지 �업로드 시 이미지 파일 확장자 변경
  • 이미지 캐싱추가

이미지 �업로드 시 이미지 파일 확장자 변경

iOS의 경우 HEIC파일을 사용하여 이미지를 저장합니다. Android에서는 지원하지 않는 포맷으로 두 플랫폼이 공유할 수 있는 파일형식이 필요했습니다.
PNG의 경우 사진의 높은 해상도를 유지할 수 있지만 사진 한장의 용량이 20MB를 넘어 버리는 일이 종종 있었습니다. 이 경우 평균적으로 5초의 로딩 시간이 필요하였습니다.
WebP형식의 경우 PNG만큼 높은 화질을 유지할 수 있고 JPEG보다 압출률이 더 뛰어납니다(20~30%). 따라서 해당 파일 포맷을 채택하였습니다.
UIImage의 경우 기본적으로 WebP형식을 지원하지 않아 써드파티를 사용했습니다.

이미지 캐싱추가

이미지의 빠른 로딩을 위해 캐싱기능을 추가했습니다.
WebP를 지원하는 캐싱을 구현하기위해 직접 캐싱관리 객체를 구현하였습니다.
메모리 캐싱의 경우 NSCache를 사용했습니다.
디스크 캐싱의 경우 FileManager를 사용했습니다.
이미지 캐싱은 다음과 같은 과정으로 진행됩니다.
image

학습한점

NSCache의 동작원리 NSString

NSCache는 Key, Value를 모두 클래스로 전달받는다. Key의 경우 강하게, Value의 경우 내부적으로 약하(weak)게 참조를 한다.
NSCache에 저장한 이후에도 해당 객체들에 대한 참조를 유지해야 NSCache에서 삭제되지 않는다.
외부 참조가 없을 경우 Key, Value쌍은 자동으로 삭제될 수 있다. (실제로 바로 삭제되진 않고 NSCache의 삭제대상이 된다.)
그리고 Key값비교는 참조비교를 통해 진행됨으로 인스턴스 내부 값이 같아도 다른 키로 인식된다.
이런 방식을 사용하는 이유는 메모리 관리를 원할하게 하기 위함이라고 한다.
NSString의 경우 내용이 같으면 모든 인스턴스가 하나의 객체를 공유한다.
특정 Key인스턴스를 여러곳에서 공유할 필요가 없음으로 Key값으로 사용하기 적절한 클래스이다.

@J0onYEong J0onYEong merged commit dd7cfdc into develop Sep 22, 2024
1 check failed
@J0onYEong J0onYEong deleted the feature/image_optimization branch September 22, 2024 14:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant