Skip to content

Commit 9b9a2fc

Browse files
committed
fix: 웹페이지 썸네일 캐시 복구 로직 수정 및 삭제 시 캐시 정리
1 parent 91d2674 commit 9b9a2fc

3 files changed

Lines changed: 57 additions & 53 deletions

File tree

DevLog/Data/Repository/WebPageRepositoryImpl.swift

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77

88
import Foundation
9+
import UIKit
910

1011
final class WebPageRepositoryImpl: WebPageRepository {
1112
private let webPageService: WebPageService
@@ -25,22 +26,19 @@ final class WebPageRepositoryImpl: WebPageRepository {
2526
pages.reserveCapacity(responses.count)
2627

2728
for response in responses {
28-
if needsImageRestore(response), let restored = try? await restoreWebPage(response) {
29-
pages.append(restored)
29+
if await needsImageRestore(response) {
30+
if let restored = try? await restoreWebPage(response) {
31+
pages.append(restored)
32+
} else if let page = try? responseWithoutImage(response).toDomain() {
33+
pages.append(page)
34+
}
3035
continue
3136
}
3237
if let page = try? response.toDomain() {
3338
pages.append(page)
3439
}
3540
}
3641

37-
// 쿼리가 비어있을 때 모든 웹페이지를 fetch 해오기 때문에 가능한 것
38-
if query.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
39-
await metadataService.removeUnusedCachedImages(
40-
keeping: responses.map(\.imageURL)
41-
)
42-
}
43-
4442
return pages
4543
}
4644

@@ -62,13 +60,24 @@ final class WebPageRepositoryImpl: WebPageRepository {
6260
}
6361

6462
private extension WebPageRepositoryImpl {
65-
func needsImageRestore(_ response: WebPageResponse) -> Bool {
63+
func needsImageRestore(_ response: WebPageResponse) async -> Bool {
6664
guard !response.imageURL.isEmpty,
6765
let url = URL(string: response.imageURL),
6866
url.isFileURL else {
6967
return false
7068
}
71-
return !FileManager.default.fileExists(atPath: url.path)
69+
70+
return await Task.detached(priority: .utility) {
71+
guard FileManager.default.fileExists(atPath: url.path) else {
72+
return true
73+
}
74+
75+
guard let imageData = try? Data(contentsOf: url) else {
76+
return true
77+
}
78+
79+
return UIImage(data: imageData) == nil
80+
}.value
7281
}
7382

7483
func restoreWebPage(_ response: WebPageResponse) async throws -> WebPage? {
@@ -91,4 +100,14 @@ private extension WebPageRepositoryImpl {
91100

92101
return try? newResponse.toDomain()
93102
}
103+
104+
func responseWithoutImage(_ response: WebPageResponse) -> WebPageResponse {
105+
WebPageResponse(
106+
id: response.id,
107+
title: response.title,
108+
url: response.url,
109+
displayURL: response.displayURL,
110+
imageURL: ""
111+
)
112+
}
94113
}

DevLog/Infra/Service/WebPageMetadataService.swift

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -61,43 +61,6 @@ final class WebPageMetadataService {
6161
}
6262
}
6363

64-
func removeUnusedCachedImages(keeping imageURLStrings: [String]) async {
65-
let keptPaths: Set<String> = Set(
66-
imageURLStrings.compactMap { imageURLString in
67-
guard let url = URL(string: imageURLString), url.isFileURL else {
68-
return nil
69-
}
70-
return url.path
71-
}
72-
)
73-
74-
do {
75-
let removedCount = try await Task.detached(priority: .utility) {
76-
let imageDir = try Self.imageDirectoryURL()
77-
guard FileManager.default.fileExists(atPath: imageDir.path) else { return 0 }
78-
79-
let cachedFileURLs = try FileManager.default.contentsOfDirectory(
80-
at: imageDir,
81-
includingPropertiesForKeys: nil,
82-
options: [.skipsHiddenFiles]
83-
)
84-
85-
var removedCount = 0
86-
for fileURL in cachedFileURLs where !keptPaths.contains(fileURL.path) {
87-
try FileManager.default.removeItem(at: fileURL)
88-
removedCount += 1
89-
}
90-
return removedCount
91-
}.value
92-
93-
if 0 < removedCount {
94-
logger.info("Removed \(removedCount) unused cached images")
95-
}
96-
} catch {
97-
logger.error("Failed to remove unused cached images", error: error)
98-
}
99-
}
100-
10164
private func extractImageURL(from imageProvider: NSItemProvider?, url: URL) async throws -> URL? {
10265
guard let imageProvider else { return nil }
10366

DevLog/UI/Common/Component/WebItemRow.swift

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,7 @@ struct WebItemRow: View {
1515

1616
var body: some View {
1717
HStack {
18-
CacheableImage(url: item.imageURL) {
19-
Image(systemName: "globe")
20-
.resizable()
21-
.scaledToFit()
22-
}
18+
thumbnail
2319
.frame(width: sceneWidth / 10, height: sceneWidth / 10)
2420
.clipShape(RoundedRectangle(cornerRadius: 10))
2521

@@ -41,4 +37,30 @@ struct WebItemRow: View {
4137
}
4238
.padding(.vertical, 4)
4339
}
40+
41+
@ViewBuilder
42+
private var thumbnail: some View {
43+
if let imageURL = item.imageURL {
44+
AsyncImage(url: imageURL) { phase in
45+
switch phase {
46+
case .success(let image):
47+
image
48+
.resizable()
49+
.scaledToFill()
50+
case .empty:
51+
ProgressView()
52+
default:
53+
placeholderImage
54+
}
55+
}
56+
} else {
57+
placeholderImage
58+
}
59+
}
60+
61+
private var placeholderImage: some View {
62+
Image(systemName: "globe")
63+
.resizable()
64+
.scaledToFit()
65+
}
4466
}

0 commit comments

Comments
 (0)