diff --git a/Sources/NetShears/Storage.swift b/Sources/NetShears/Storage.swift index f12c0c6..9055fd3 100644 --- a/Sources/NetShears/Storage.swift +++ b/Sources/NetShears/Storage.swift @@ -9,40 +9,50 @@ import Foundation final class Storage: NSObject { - static let shared: Storage = Storage() - + private let accessQueue = DispatchQueue(label: "com.netshears.queue", attributes: .concurrent) + private(set) var requests: [NetShearsRequestModel] = [] var filteredRequests: [NetShearsRequestModel] { - return getFilteredRequests() + getFilteredRequests() } - func saveRequest(request: NetShearsRequestModel?){ - guard request != nil else { - return + func saveRequest(request: NetShearsRequestModel) { + accessQueue.async(flags: .barrier) { [weak self] in + guard let self = self else { + return + } + if let index = self.requests.firstIndex(where: { (req) -> Bool in + return request.id == req.id ? true : false + }) { + self.requests[index] = request + } else { + self.requests.insert(request, at: 0) + } + NotificationCenter.default.post(name: NSNotification.Name.NewRequestNotification, object: nil) } - - if let index = requests.firstIndex(where: { (req) -> Bool in - return request?.id == req.id ? true : false - }) { - requests[index] = request! - } else { - requests.insert(request!, at: 0) - } - NotificationCenter.default.post(name: NSNotification.Name.NewRequestNotification, object: nil) } func clearRequests() { - requests.removeAll() + accessQueue.async(flags: .barrier) { [weak self] in + self?.requests.removeAll() + } } private func getFilteredRequests() -> [NetShearsRequestModel] { + var localRequests = [NetShearsRequestModel]() + accessQueue.sync { + localRequests = requests + } + return Self.filterRequestsIfNeeded(localRequests) + } + + private static func filterRequestsIfNeeded(_ requests: [NetShearsRequestModel]) -> [NetShearsRequestModel] { guard case Ignore.enabled(let ignoreHandler) = NetShears.shared.ignore else { return requests } - let filteredRequests = requests.filter { ignoreHandler($0) == false } - return filteredRequests + return requests.filter { ignoreHandler($0) == false } } }