Skip to content

Commit 7cb7aa0

Browse files
committed
refactor: WebPageImageStore 파일 I/O를 백그라운드 실행으로 분리
1 parent 0686918 commit 7cb7aa0

1 file changed

Lines changed: 67 additions & 39 deletions

File tree

DevLog/Storage/Persistence/WebPageImageStore.swift

Lines changed: 67 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,56 +9,90 @@ import CryptoKit
99
import Foundation
1010

1111
actor WebPageImageStore {
12-
private let fileManager: FileManager
12+
func cachedImageURL(for url: URL) async throws -> URL {
13+
return try await Task.detached(priority: .utility) {
14+
return try Self.cachedImageURL(for: url)
15+
}.value
16+
}
17+
18+
func saveImage(_ data: Data, for url: URL) async throws -> URL {
19+
return try await Task.detached(priority: .utility) {
20+
return try Self.saveImage(data, for: url)
21+
}.value
22+
}
23+
24+
func dirSizeInBytes() async -> Int64 {
25+
do {
26+
return try await Task.detached(priority: .utility) {
27+
return try Self.dirSizeInBytes()
28+
}.value
29+
} catch {
30+
return 0
31+
}
32+
}
33+
34+
func clearDirectory() async throws {
35+
try await Task.detached(priority: .utility) {
36+
try Self.clearDirectory()
37+
}.value
38+
}
1339

14-
init(fileManager: FileManager = .default) {
15-
self.fileManager = fileManager
40+
func removeImage(for url: URL) async throws -> Bool {
41+
return try await Task.detached(priority: .utility) {
42+
return try Self.removeImage(for: url)
43+
}.value
1644
}
45+
}
1746

18-
func cachedImageURL(for url: URL) throws -> URL {
19-
let imageDirectoryURL = try self.imageDirectoryURL(create: true)
47+
private extension WebPageImageStore {
48+
static func hashedFileName(for url: URL) -> String {
49+
let hashValue = SHA256.hash(data: Data(url.absoluteString.utf8))
50+
return hashValue.map { String(format: "%02x", $0) }.joined()
51+
}
52+
53+
static func cachedImageURL(for url: URL) throws -> URL {
54+
let fileManager = FileManager.default
55+
let imageDirectoryURL = try imageDirectoryURL(create: true, fileManager: fileManager)
2056
let fileName = hashedFileName(for: url)
2157

2258
return imageDirectoryURL
2359
.appendingPathComponent(fileName)
2460
.appendingPathExtension("jpeg")
2561
}
2662

27-
func saveImage(_ data: Data, for url: URL) throws -> URL {
63+
static func saveImage(_ data: Data, for url: URL) throws -> URL {
2864
let fileURL = try cachedImageURL(for: url)
2965
try data.write(to: fileURL, options: [.atomic])
3066
return fileURL
3167
}
3268

33-
func dirSizeInBytes() -> Int64 {
34-
do {
35-
let imageDirectoryURL = try self.imageDirectoryURL(create: false)
36-
guard fileManager.fileExists(atPath: imageDirectoryURL.path) else { return 0 }
37-
guard let enumerator = fileManager.enumerator(
38-
at: imageDirectoryURL,
39-
includingPropertiesForKeys: [.isRegularFileKey, .fileSizeKey],
40-
options: [.skipsHiddenFiles]
41-
) else {
42-
return 0
43-
}
69+
static func dirSizeInBytes() throws -> Int64 {
70+
let fileManager = FileManager.default
71+
let imageDirectoryURL = try imageDirectoryURL(create: false, fileManager: fileManager)
72+
guard fileManager.fileExists(atPath: imageDirectoryURL.path) else { return 0 }
73+
guard let enumerator = fileManager.enumerator(
74+
at: imageDirectoryURL,
75+
includingPropertiesForKeys: [.isRegularFileKey, .fileSizeKey],
76+
options: [.skipsHiddenFiles]
77+
) else {
78+
return 0
79+
}
4480

45-
var total: Int64 = 0
46-
for case let fileURL as URL in enumerator {
47-
guard let resourceValues = try? fileURL.resourceValues(forKeys: [.isRegularFileKey, .fileSizeKey]),
48-
resourceValues.isRegularFile == true,
49-
let fileSize = resourceValues.fileSize else {
50-
continue
51-
}
52-
total += Int64(fileSize)
81+
var total: Int64 = 0
82+
for case let fileURL as URL in enumerator {
83+
guard let resourceValues = try? fileURL.resourceValues(forKeys: [.isRegularFileKey, .fileSizeKey]),
84+
resourceValues.isRegularFile == true,
85+
let fileSize = resourceValues.fileSize else {
86+
continue
5387
}
54-
return total
55-
} catch {
56-
return 0
88+
total += Int64(fileSize)
5789
}
90+
return total
5891
}
5992

60-
func clearDirectory() throws {
61-
let imageDirectoryURL = try self.imageDirectoryURL(create: false)
93+
static func clearDirectory() throws {
94+
let fileManager = FileManager.default
95+
let imageDirectoryURL = try imageDirectoryURL(create: false, fileManager: fileManager)
6296
guard fileManager.fileExists(atPath: imageDirectoryURL.path) else { return }
6397
let contentURLs = try fileManager.contentsOfDirectory(
6498
at: imageDirectoryURL,
@@ -70,21 +104,15 @@ actor WebPageImageStore {
70104
}
71105
}
72106

73-
func removeImage(for url: URL) throws -> Bool {
107+
static func removeImage(for url: URL) throws -> Bool {
108+
let fileManager = FileManager.default
74109
let fileURL = try cachedImageURL(for: url)
75110
guard fileManager.fileExists(atPath: fileURL.path) else { return false }
76111
try fileManager.removeItem(at: fileURL)
77112
return true
78113
}
79-
}
80-
81-
private extension WebPageImageStore {
82-
func hashedFileName(for url: URL) -> String {
83-
let hashValue = SHA256.hash(data: Data(url.absoluteString.utf8))
84-
return hashValue.map { String(format: "%02x", $0) }.joined()
85-
}
86114

87-
func imageDirectoryURL(create: Bool) throws -> URL {
115+
static func imageDirectoryURL(create: Bool, fileManager: FileManager) throws -> URL {
88116
let directory = try fileManager.url(
89117
for: .applicationSupportDirectory,
90118
in: .userDomainMask,

0 commit comments

Comments
 (0)