|
9 | 9 | import Foundation
|
10 | 10 |
|
11 | 11 | final class Storage: NSObject {
|
12 |
| - |
13 | 12 | static let shared: Storage = Storage()
|
14 |
| - |
| 13 | + private let accessQueue = DispatchQueue(label: "com.netshears.queue", attributes: .concurrent) |
| 14 | + |
15 | 15 | private(set) var requests: [NetShearsRequestModel] = []
|
16 | 16 |
|
17 | 17 | var filteredRequests: [NetShearsRequestModel] {
|
18 |
| - return getFilteredRequests() |
| 18 | + getFilteredRequests() |
19 | 19 | }
|
20 | 20 |
|
21 |
| - func saveRequest(request: NetShearsRequestModel?){ |
22 |
| - guard request != nil else { |
23 |
| - return |
| 21 | + func saveRequest(request: NetShearsRequestModel) { |
| 22 | + accessQueue.async(flags: .barrier) { [weak self] in |
| 23 | + guard let self = self else { |
| 24 | + return |
| 25 | + } |
| 26 | + if let index = self.requests.firstIndex(where: { (req) -> Bool in |
| 27 | + return request.id == req.id ? true : false |
| 28 | + }) { |
| 29 | + self.requests[index] = request |
| 30 | + } else { |
| 31 | + self.requests.insert(request, at: 0) |
| 32 | + } |
| 33 | + NotificationCenter.default.post(name: NSNotification.Name.NewRequestNotification, object: nil) |
24 | 34 | }
|
25 |
| - |
26 |
| - if let index = requests.firstIndex(where: { (req) -> Bool in |
27 |
| - return request?.id == req.id ? true : false |
28 |
| - }) { |
29 |
| - requests[index] = request! |
30 |
| - } else { |
31 |
| - requests.insert(request!, at: 0) |
32 |
| - } |
33 |
| - NotificationCenter.default.post(name: NSNotification.Name.NewRequestNotification, object: nil) |
34 | 35 | }
|
35 | 36 |
|
36 | 37 | func clearRequests() {
|
37 |
| - requests.removeAll() |
| 38 | + accessQueue.async(flags: .barrier) { [weak self] in |
| 39 | + self?.requests.removeAll() |
| 40 | + } |
38 | 41 | }
|
39 | 42 |
|
40 | 43 | private func getFilteredRequests() -> [NetShearsRequestModel] {
|
| 44 | + var localRequests = [NetShearsRequestModel]() |
| 45 | + accessQueue.sync { |
| 46 | + localRequests = requests |
| 47 | + } |
| 48 | + return Self.filterRequestsIfNeeded(localRequests) |
| 49 | + } |
| 50 | + |
| 51 | + private static func filterRequestsIfNeeded(_ requests: [NetShearsRequestModel]) -> [NetShearsRequestModel] { |
41 | 52 | guard case Ignore.enabled(let ignoreHandler) = NetShears.shared.ignore else {
|
42 | 53 | return requests
|
43 | 54 | }
|
44 |
| - let filteredRequests = requests.filter { ignoreHandler($0) == false } |
45 |
| - return filteredRequests |
| 55 | + return requests.filter { ignoreHandler($0) == false } |
46 | 56 | }
|
47 | 57 |
|
48 | 58 | }
|
0 commit comments