2017-09-08 22 views
2
let memoryCapacity = 200 * 1024 * 1024 
let diskCapacity = 1 * 1024 * 1024 
let cache = URLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "myDataPath") 
URLCache.shared = cache 

시나리오 1urlcache의 메모리와 디스크에서 정확히 일들이 제거 되나요?

나는 200메가바이트에의 Urlcache의 메모리를 설정하고 1메가바이트에 디스크 공간을 설정하고있다. 그런 다음 이미지를 다운로드합니다. 인터넷을 끄고 응용 프로그램을 종료하고 응용 프로그램을 다시 실행하고 다시 실행 한 다음 이미지를 다운로드하려면 호출을 실행하십시오. datanil입니다.

인터넷을 끄면 말할 필요도없이 캐시에서 예상대로 읽었을 때 크래시가 발생하지 않습니다. 내가 캐시가 메모리에서 플러시 경우에도 다음 200메가바이트에 diskCapacity (let diskCapacity = 200 * 1024 * 1024) 을 설정하면

시나리오 2

, 여전히 이미지가 디스크에 유지됩니다; 그것은 항상 보여줄 것입니다! 이러한 관찰을 바탕으로


, 나는 다음과 같은 질문이 있습니다 때문에 메모리 경고/문제에

  • 그것이 올바른 말을하는 것입니다, 당신이 강제 종료 할 때마다 또는 앱 충돌 캐시를 얻을 것이다 플러시되었지만 디스크가 손상되지 않았습니다.
  • 캐시가 메모리에서 플러시 될 수있는 다른 이유는 무엇입니까?
  • 디스크에 저장된 내용을 언제 제거 할 수 있습니까?

답변

1

짧은 답변 :

메모리 캐시가 손실 될 때 응용 프로그램의 종료 (또는 가능성, 메모리 부족, 너무 아래). 디스크 캐시는 응용 프로그램의 여러 호출에서 지속되지만 장치가 영구 저장소를 모두 소모하고 OS가 캐시 및 임시 폴더에서 공간을 회수하면 제거 할 수 있습니다.


긴 대답 :

당신은 질문 :

그것이 올바른 말을하는 것입니다, 모든 당신이 강제 종료 시간 또는 앱 충돌로 인해 메모리 경고/문제에 캐시가 플러시 얻을 것이다 디스크를 손상시키지 않아도됩니까?

크게. 앱이 종료 될 때 앱과 관련된 모든 메모리가 삭제되고 영구 저장소에 저장된 항목 만 앱이 다시 시작될 때 검색 될 수 있다고 말하는 것이 더 정확할 수 있습니다.

캐시가 메모리에서 플러시 될 수있는 다른 곳이 있습니까?

앱이 종료되면 메모리 캐시에있는 모든 것을 잃게됩니다. 분명히 몇 가지 다른 경우에 항목을 제거 할 수 있습니다.

  • URLCache에서 수동으로 응답을 제거하는 경우
  • 캐시의 최대 용량에 도달하면 이전 항목을 캐시에서 제거하고 새 항목을 추가하여 이전 항목을 강제로 제거하려고합니다.
  • 네트워크 응답에는 종종 캐시 정책 (응답을 안전하게 캐시 할 수있는 기간 표시)이 포함되어 있으므로 해당 시점에 제거 될 가능성이 큽니다.
  • 메모리 캐시가 메모리 압력 (예 : .UIApplicationDidReceiveMemoryWarning)에 따라 적절히 제거 될 수 있습니다.

디스크에 저장된 내용을 언제 제거 할 수 있습니까?

로직은 (a) 앱의 호출 전체에서 생존 할 수 있다는 점을 제외하고는 이전 포인트와 거의 동일합니다. (b) 메모리가 부족할 때 플러시되지 않지만 영구 저장 장치가 부족한 경우 장치를 제거 할 수 있습니다.

+0

정말 고마워요. "영구 저장소에서 장치의 실행이 부족할 때"에 대한 콜백이 없습니까? – Honey

+0

내가 아는 바가 없다. – Rob