일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Terminal
- type
- enum
- Git
- initializer
- url
- 디자인패턴
- 스위프트
- Xcode
- 이니셜라이저
- optional
- String
- UIKit
- Method
- initalizer
- property
- IOS
- Swift
- struct
- instance
- tuist
- extension
- 코딩테스트
- Foundation
- Protocol
- Unicode
- interpace
- delegate
- init
- Class
- Today
- Total
아리의 iOS 탐구생활
[URLRequst] 네트워크 요청 시 캐시 제어 하는 방법 본문
# 문제 상황
Github API로 스타표시를 변경한 후 (PUT), 사용자의 스타 체크한 레파지토리 목록을 불러올 때 (GET), 업데이트 된 목록이 아니라
기존에 불러왔었던 Response를 불러오는 문제로 레파지토리 목록이 업데이트가 제대로 되지 않는 현상이였다.
정확히는 바로 새 데이터로 업데이트 되지 않고, 몇초 이후에 다시 네트워크 요청을 하여 재시도하면 새 데이터를 불러오는듯한 현상이였다.
# 고민 해보기
- 왜 PUT 이후 GET을 요청했을 때, 업데이트 된 레파지토리 목록을 불러오는데 시간이 걸릴까?
- API 자체적인 문제인가? 포스트맨으로도 테스트 해보자!
- 정상이다. 혹시 리스폰스를 캐시처리 하나...?
기존에 요청해서 받았던 리스폰스가 캐싱되어 새롭게 업데이트 된 데이터를 불러오는 것이 아니라
캐시처리 되어있는 리스폰스를 불러오는 것 같다는 생각이 들었다.
# 시도하기
URLSessionConfiguration의 속성을 ephemeral로 할당한 후 테스트 해본 결과,
정상적으로 새롭게 업데이트 된 Response를 받아왔다.
- Ephemeral session
- 델리게이트 없이 비공개(private) 세션
- Delegate없이 비공개 세션을 만들 때 사용한다.
- 사파리나 크롬에서 시크릿 모드를 만들 때 사용한다.
- 쿠키나 세션정보가 남아있지 않게 된다.
하지만 이걸로 문제를 완벽히 해결되었다고 결론내기가 찝찝했다.
그 이유는 ephemeral 속성의 경우 다른 네트워크 요청들도 캐시가 적용되지 않는다는 점이다.
변하지 않는 큰 데이터의 경우는 캐시처리가 되는 것이 더 도움이 될탠데... 하는 생각이 들어서
특정 요청만 캐시처리를 하지 않도록 하고 싶었다.
그래서 다시 찾아본 결과 URLRequest 내부 속성중에는 캐시 정책을 설정할 수 있는 속성이 있었다.
또한 아예 네트워크 요청 시 Header에 Cache-Control을 할당해서 리스폰스를 캐시하지 않겠다고 하고 네트워크를 요청할 수도 있다.
# 해결 방법
위와 같이 URLRequest 속성중 cachePolicy를 .reloadIgnoringLocalCacheData로 할당해주어서 해결하였다.
헤더에 Cache-Control를 할당주어 데이터를 요청 시에 Cache 관련 제어를 하는 방법도 있지만
하드 코딩이라는 생각이 들어서 이러한 방법으로 해결하게 되었다.
Header를 통한 해결 방법
// Request 타입 중 속성...
var headers: [String : String]? {
return [
"Authorization": "token \(KeyChainManager.shard.load(GithubAuthorize.token) ?? "")",
"Cache-Control": "no-store" // 이 부분을 추가하여 리스폰스를 캐시처리 하지 않도록 요청
]
}
URLRequest의 프로퍼티를 이용한 해결 방법
var request = URLRequest(url: url)
// 캐시 정책 할당 (로컬 캐시 데이터 무시)
request.cachePolicy = .reloadIgnoringLocalCacheData
Reference
'Swift > 문제해결' 카테고리의 다른 글
[iOS/Tuist] Objective-C 코드가 포함된 라이브러리 의존성 주입시 발생하는 문제 (3) | 2023.02.27 |
---|---|
[Xcode Cloud] Tuist로 만든 프로젝트에 Xcode Cloud 적용하는 법 (2) | 2022.12.07 |
Swift의 String index는 왜 정수가 아니지? 왜 구하기 어려울까? (1) | 2021.09.13 |
Cannot use mutating member on immutable value: function call returns immutable value (0) | 2021.09.13 |
atomically는 프로그래밍에서 무슨 뜻일까... (0) | 2021.09.13 |