@@ -10,33 +10,32 @@ import Vision
1010import ComposableArchitecture
1111import CoreImage
1212
13- public final class DefaultImageTransformRepository : ImageTransformRepository {
13+ public actor DefaultImageTransformRepository : ImageTransformRepository {
1414
15- private let modelTask : Task < VNCoreMLModel , Error >
15+ private var cachedModel : VNCoreMLModel ?
1616 private let ciContext = CIContext ( options: [ . cacheIntermediates: false ] )
1717
18- public init ( ) {
19- let config = MLModelConfiguration ( )
20- config. computeUnits = . all
18+ public func transform( image inputImage: CGImage ) async throws -> CGImage {
2119
22- self . modelTask = Task {
20+ if self . cachedModel == nil {
21+ let config = MLModelConfiguration ( )
22+ config. computeUnits = . all
23+
2324 let coreML = try whiteboxcartoonization ( configuration: config) . model
24- return try VNCoreMLModel ( for: coreML)
25+ self . cachedModel = try VNCoreMLModel ( for: coreML)
2526 }
26- }
27-
28- public func transform( image inputImage: CGImage ) async throws -> CGImage {
29- let visionModel = try await modelTask. value
3027
31- return try await Task ( priority: . userInitiated) {
32- let request = VNCoreMLRequest ( model: visionModel)
33- request. imageCropAndScaleOption = . scaleFit
34-
35- let handler = VNImageRequestHandler ( cgImage: inputImage)
36- try handler. perform ( [ request] )
37-
38- return try self . extractCGImage ( from: request. results)
39- } . value
28+ guard let visionModel = self . cachedModel else {
29+ throw ImageTransformRepositoryError . renderingFailed
30+ }
31+
32+ let request = VNCoreMLRequest ( model: visionModel)
33+ request. imageCropAndScaleOption = . scaleFit
34+
35+ let handler = VNImageRequestHandler ( cgImage: inputImage)
36+ try handler. perform ( [ request] )
37+
38+ return try self . extractCGImage ( from: request. results)
4039 }
4140}
4241
0 commit comments