| | |
| | | scanCacheLock.unlock() |
| | | } |
| | | |
| | | static func shouldRefreshForSearchPathChanges() -> Bool { |
| | | scanCacheLock.lock() |
| | | let hasCachedApps = cachedScanApps != nil |
| | | let cachedSignature = cachedSearchPathSignature |
| | | scanCacheLock.unlock() |
| | | |
| | | guard hasCachedApps else { return true } |
| | | return cachedSignature != currentSearchPathSignature() |
| | | } |
| | | |
| | | private static func cachedScanIfFresh(matching searchPathSignature: [SearchPathSignature]) -> [AppInfo]? { |
| | | scanCacheLock.lock() |
| | | defer { scanCacheLock.unlock() } |
| | |
| | | private static func deduplicationIdentity(for app: AppInfo) -> String { |
| | | if let bundleIdentifier = app.bundleIdentifier?.trimmingCharacters(in: .whitespacesAndNewlines), |
| | | !bundleIdentifier.isEmpty { |
| | | return "bundle:\(bundleIdentifier.lowercased())" |
| | | return "bundle:\(bundleIdentifier.lowercased())|name:\(normalizedAppName(app.name))" |
| | | } |
| | | return "name:\(normalizedAppName(app.name))" |
| | | } |