forked from apollographql/apollo-ios
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInMemoryNormalizedCache.swift
More file actions
46 lines (40 loc) · 1.73 KB
/
InMemoryNormalizedCache.swift
File metadata and controls
46 lines (40 loc) · 1.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import Foundation
public final class InMemoryNormalizedCache: NormalizedCache {
private var records: RecordSet
private let recordsLock = NSRecursiveLock()
public init(records: RecordSet = RecordSet()) {
self.records = records
}
public func loadRecords(forKeys keys: [CacheKey],
callbackQueue: DispatchQueue?,
completion: @escaping (Result<[Record?], Error>) -> Void) {
self.recordsLock.lock()
let records = keys.map { self.records[$0] }
self.recordsLock.unlock()
DispatchQueue.apollo.returnResultAsyncIfNeeded(on: callbackQueue,
action: completion,
result: .success(records))
}
public func merge(records: RecordSet,
callbackQueue: DispatchQueue?,
completion: @escaping (Result<Set<CacheKey>, Error>) -> Void) {
self.recordsLock.lock()
let cacheKeys = self.records.merge(records: records)
self.recordsLock.unlock()
DispatchQueue.apollo.returnResultAsyncIfNeeded(on: callbackQueue,
action: completion,
result: .success(cacheKeys))
}
public func clear(callbackQueue: DispatchQueue?,
completion: ((Result<Void, Error>) -> Void)?) {
clearImmediately()
DispatchQueue.apollo.returnResultAsyncIfNeeded(on: callbackQueue,
action: completion,
result: .success(()))
}
public func clearImmediately() {
self.recordsLock.lock()
self.records.clear()
self.recordsLock.unlock()
}
}