[iOS] 좌충우돌 KingFIsher에 Header 달기

유인호·2024년 4월 21일
0

iOS

목록 보기
42/64
post-thumbnail

0. 서론

서버의 이미지를 받아오는 과정에서 Request를 하려면 KingFisher Request에 Header를 넣어줘야 했음. 그러나, AccessToken같은걸 관리하는 과정에서 어떤식으로 하면 좋을지에 대한 고민.

1. 일단 헤더 셋팅 함수 만들기

헤더에 포함 되어야 하는 내용은 엑세스토큰, API Key, contentType이다. 나중에 어디서든 귀찮아 질 수 있으니 함수를 하나 Extension으로 만들어 보았음.

extension KingfisherManager {
	func setHeaders() {
		let modifier = AnyModifier { request in
			var req = request
			req.addValue(UserDefaults.standard[.accessToken], forHTTPHeaderField: HTTPHeader.authorization.rawValue)
			req.addValue(APIKey.sesacKey.rawValue, forHTTPHeaderField: HTTPHeader.sesackey.rawValue)
			req.addValue(HTTPHeader.json.rawValue, forHTTPHeaderField: HTTPHeader.contentType.rawValue)
			return req
		}

		KingfisherManager.shared.defaultOptions = [
			.requestModifier(modifier)
		]
	}
}

2. 첫번째 안

언제 엑세스 토큰이 만료될 지 모르니, KingFisher에 SetImage하기 전 함수를 실행해주면 되지 않을까? 싶어 이런식으로 한번 해보았는데,

문제가 많다. 일단 첫번째는 셀 안에 들어가 있어 셀 갯수만큼 이 함수가 실행이 된다는 점. 또한 개발자가 까먹고 setHeaders()를 실행하지 않을 확률이 크다는점이겠다.

3. 두번째 안

프로그래머 입장에서 편하기 위해 아에 킹피셔를 활용한 다른 함수를 만들었다.

extension KingfisherWrapper where Base: KFCrossPlatformImageView {
	@discardableResult
	func setHeaderAndImage(with resource: Resource?) -> DownloadTask? {
		KingfisherManager.shared.setHeaders()
		return setImage(
			 with: resource,
			 placeholder: nil,
			 options: nil,
			 progressBlock: nil,
			 completionHandler: nil)
	}
}

두번째 안은 개발자가 까먹지 않고 Header를 설정해 줄 수 있다는 점 이곘다. 그러나 첫번째 안과 비슷하게 요청을 할때마다 헤더를 갈아 끼워주고 있다. 그렇게 효율적이지 않다.

4. 세번째 안

돌고돌아 클래식인가.

private func refreshAccessToken(_ completionHandler: @escaping ()->Void) {
.......
	KingfisherManager.shared.setHeaders()
.......
}

KingFisher의 Header는 리프레시 토큰에 의존이 되어 있기에, 다른곳에서 설정해주기 보다 refresh토큰을 새로 발급해주는 곳에서 설정해주는게 제일 낫다고 판단하였다.

profile
🍎Apple Developer Academy @ POSTECH 2nd, 🌱SeSAC iOS 4th

0개의 댓글