Proyectos de Subversion Iphone Microlearning - Nuevo Interface

Rev

Rev 11 | Rev 21 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
//
2
//  ImageLoader.swift
3
//  twogetskills
4
//
5
//  Created by Efrain Yanez Recanatini on 3/9/22.
6
//
7
 
8
import Combine
9
import UIKit
10
import var CommonCrypto.CC_MD5_DIGEST_LENGTH
11
import func CommonCrypto.CC_MD5
12
import typealias CommonCrypto.CC_LONG
13
 
14
 
15
class ImageLoader: ObservableObject {
16
    @Published var image: UIImage?
17 efrain 17
 
1 efrain 18
    private(set) var isLoading = false
19
 
20
    private let url: URL
21
    private var cache: ImageCache?
17 efrain 22
    private var appData = AppData.sharedInstance
1 efrain 23
 
24
    init(url: URL, cache: ImageCache? = nil) {
25
        self.url = url
26
        self.cache = cache
27
    }
28
 
29
    /*
30
    deinit {
31
        cancel()
32
    }
33
 */
34
 
35
    func load() {
17 efrain 36
 
1 efrain 37
 
38
        let urlString : String = url.absoluteString
39
 
11 efrain 40
        //print("ImageLoader URL : \(urlString) ")
1 efrain 41
 
42
        //guard !isLoading else { return }
43
 
44
 
45
        let md5Data = MD5(string: urlString)
46
        let key =  md5Data.map {
47
            String(format: "%02hhx", $0)
48
 
49
        }.joined()
50
 
51
        if let image = cache?[key as NSString] {
11 efrain 52
            //print("ImageLoader in Cache")
1 efrain 53
            self.image = image
54
            return
55
        }
56
 
11 efrain 57
        //print("ImageLoader not in Cache")
1 efrain 58
 
59
 
60
        var request = URLRequest(url: url)
61
 
62
        let headerSecurity = HeaderSecurity()
63
 
64
        request.httpMethod = "GET"
65
        request.addValue(appData.deviceUuid, forHTTPHeaderField: Constants.HTTP_HEADER_SECURITY_TOKEN)
66
        request.addValue(headerSecurity.secret, forHTTPHeaderField: Constants.HTTP_HEADER_SECURITY_SECRET)
67
        request.addValue(String(headerSecurity.created), forHTTPHeaderField: Constants.HTTP_HEADER_SECURITY_CREATED)
68
        request.addValue(String(headerSecurity.rand), forHTTPHeaderField: Constants.HTTP_HEADER_SECURITY_RAND)
69
 
70
 
11 efrain 71
        //print("ImageLoader Header \(Constants.HTTP_HEADER_SECURITY_TOKEN) =  \(appData.deviceUuid) ")
72
        //print("ImageLoader Header \( Constants.HTTP_HEADER_SECURITY_SECRET) =  \(headerSecurity.secret) ")
73
        //print("ImageLoader Header \(Constants.HTTP_HEADER_SECURITY_CREATED) =  \(headerSecurity.created) ")
74
        //print("ImageLoader Header \(Constants.HTTP_HEADER_SECURITY_RAND) =  \(headerSecurity.rand) ")
1 efrain 75
 
76
        /*
77
        cancellable = URLSession.shared.dataTaskPublisher(for: request)
78
            .map { UIImage(data: $0.data) }
79
            .replaceError(with: nil)
80
            .handleEvents(receiveSubscription: { [weak self] _ in self?.onStart() },
81
                          receiveOutput: { [weak self] in self?.cache($0) },
82
                          receiveCompletion: { [weak self] _ in self?.onFinish() },
83
                          receiveCancel: { [weak self] in self?.onFinish() })
84
            .subscribe(on: Self.imageProcessingQueue)
85
            .receive(on: DispatchQueue.main)
86
            .sink { [weak self] in self?.image = $0 }*/
87
 
88
        let task = URLSession.shared.dataTask(with: request, completionHandler: setImageFromData)
89
        task.resume()
90
    }
91
 
92
    private func setImageFromData(data: Data?, urlResponse: URLResponse?, error: Error?) {
93
            guard error == nil else {
11 efrain 94
               // print("\(error!)")
1 efrain 95
                return
96
            }
97
 
98
            guard let content = data else {
11 efrain 99
               // print("No data")
1 efrain 100
                return
101
            }
102
 
103
            DispatchQueue.main.async {
104
                self.image = UIImage(data: content)
105
               // self.dataHasLoaded = true
106
            }
107
        }
108
 
109
    /*
110
    func cancel() {
111
        cancellable?.cancel()
112
    }
113
 
114
    private func onStart() {
115
        isLoading = true
116
    }
117
 
118
    private func onFinish() {
119
        isLoading = false
120
    }*/
121
 
122
    private func cache(_ image: UIImage?) {
123
        let urlString : String = url.absoluteString
124
 
11 efrain 125
        //print("ImageLoader URL : \(urlString) ")
1 efrain 126
 
127
        //guard !isLoading else { return }
128
 
129
 
130
        let md5Data = MD5(string: urlString)
131
        let key =  md5Data.map {
132
            String(format: "%02hhx", $0)
133
 
134
        }.joined()
135
 
136
 
137
        image.map { cache?[key as NSString] = $0 }
138
    }
139
 
140
    private func MD5(string: String) -> Data {
141
        let length = Int(CC_MD5_DIGEST_LENGTH)
142
        let messageData = string.data(using:.utf8)!
143
        var digestData = Data(count: length)
144
 
145
        _ = digestData.withUnsafeMutableBytes { digestBytes -> UInt8 in
146
        messageData.withUnsafeBytes { messageBytes -> UInt8 in
147
        if let messageBytesBaseAddress = messageBytes.baseAddress, let digestBytesBlindMemory = digestBytes.bindMemory(to: UInt8.self).baseAddress {
148
                let messageLength = CC_LONG(messageData.count)
149
                    CC_MD5(messageBytesBaseAddress, messageLength, digestBytesBlindMemory)
150
                }
151
            return 0
152
            }
153
        }
154
        return digestData
155
    }
156
 
157
}
158