Skip to content

Instantly share code, notes, and snippets.

import Promises
/// Check whether the values fulfill condition, and group the results.
/// - parameters:
/// - values: Values to check
/// - condition: Promise which states the condition
/// - returns: Promise which has grouped result of condition-passed values
public func filter<T>(values: [T], condition: ((T) -> Promise<Bool>)) -> Promise<[T]> {
let promises = values.map { value in condition(value).validate { $0 }.then { _ in value } }
return any(promises).then { $0.compactMap({ $0.value }) }
@linearhw
linearhw / Image Caching OpenSource.md
Last active December 15, 2022 06:39
이미지 캐싱 오픈소스 라이브러리에 대한 요약/정리

성능 비교하기

  • 테스트앱
  • 낮은 해상도 = 사진 크기: 10 ~ 50KB
  • 중간 해상도 = 사진 크기: 100 ~ 500KB + 5MB
  • 높은 해상도 = 사진 크기: 10 ~ 50MB
  • 기본 설정 = 설정: 메모리 100MB 디스크 150MB
  • 리사이즈 = (화면 너비 / 3)^2. iPhone 8+ 기준으로 414 pixel.

리사이즈 없이 테스트

@linearhw
linearhw / AlamofireImage.md
Last active May 8, 2018 09:18
AlamofireImage 기능 요약/정리

AlamofireImage

캐시 저장

  • af_setImage method 를 사용하면, URLCache (애플 기본 클래스) 와 AutoPurgingImageCache (Dictionary) 를 사용한다.
  • URLCache 는 원본을 갖고 있고, AutoPurgingImageCache 는 filter 를 씌운 결과를 가지고 있다.
  • AutoPurgingImageCache 는 cachedImages 라는 array 를 들고 있다. disk 는 사용하지 않는다.
  • 필터 기능을 사용하지 않는다면 URLSessionConfiguration 에서 URLCache 를 nil로 설정해야 불필요한 두 번 저장을 피할 수 있다.
@linearhw
linearhw / KingFisher.md
Last active April 24, 2024 05:29
KingFisher 의 기능 요약/정리

KingFisher

데이터 변환

  • Remote > Data & Image

    • URLSession delegate 의 receiveData 로부터 받은 data 를 모은 다음, UIImage(data: scale:) method 사용
  • Data > toDisk

    • data 의 header 를 읽어서 타입(PNG, JPG, GIF)을 판별
    • 위에서 만든 이미지를 다시 타입에 따라 데이터로 또 만들어 줌 (?)
@linearhw
linearhw / SDWebImage.md
Last active June 17, 2022 09:55
SDWebImage 의 기능 요약/정리

SDWebImage

데이터 변환

  • Remote > Data & Image
    • URLSession delegate 의 receiveData 로부터 받은 data 를 모은 다음, SDWebImageIOCoder 의 incrementallyDecodedImageWithData 를 호출하여 이미지 생성
  • Data > toDisk
    • CGImageRef 로부터 alpha 값이 있는지를 구분해서, alpha 값이 있으면 PNG 아니면 JPEG 으로 encode
    • CGImageDestinationAddImage method 사용

캐시 저장

State

언제 사용하면 좋은가

  • 내부 state 변화에 따라 객체도 바뀌어야 할 때
  • 각 state 에서 해야 할 behavior 가 모두 새로운 state 가 추가될 가능성이 있을 때

특징

  • state 에 따른 behavior 를 모두 캡슐화하고, state 의 interface 를 분리한다.
  • 지나치게 길어진 switch 문을 짧게 만들 수 있다.

Command

언제 사용하면 좋은가

  • 객체의 세부 구현을 외부에 보일 필요가 없을 때
  • undo, redo 기능이 필요할 때
  • 큐를 사용하거나 로그를 남기고 싶을 떼

특징

  • Request 를 캡슐화 하기 때문에 로그 요청이나 큐를 클라이언트에 parameter 로 전달할 수 있다
  • 함수를 직접 호출하는 구조가 아니기 때문에 클래스/메서드들이 서로를 자세히 알 필요가 없다

Composite

언제 사용하면 좋은가

  • 단일 객체든 객체들의 집합이든 같은 방법으로 취급해야 할 때
  • 기존 코드에서 단일 객체와 객체 집합을 동일한 방식/동일한 코드로 처리하고 있을 때

특징

  • 객체와 객체의 그룹을 구분 없이 하나의 인터페이스로 다룰 수 있게 한다
  • 트리 구조의 설계를 사용한다

Decorator

언제 사용하는 게 좋은가

  • 객체를 동적으로 확장할 필요가 있을 때
  • 객체에 첨가할 데이터가 다양하고 일정하지 않을 때 효율적
  • 대신 자잘한 객체가 많아지고 코드가 필요 이상으로 복잡해 질 수도 있다.

특징

  • 한 객체를 감싸기 위해 한 개 혹은 여러 개의 Decorator 를 사용할 수 있다.
  • Decorator 는 Decorate 하는 객체와 같은 type 을 가진다

개요

  • 자료 처리를 수학적 함수의 계산으로 취급하고
  • 상태와 가변 데이터를 멀리하며
  • 문제를 step by step 이 아닌 divide and conquer 로 해결하는 방식

예제

  • 기존 Factorial