mirror of
https://github.com/immich-app/immich.git
synced 2025-05-31 04:05:39 -04:00
feat: ios incremental sync optimization
This commit is contained in:
parent
09e5503fb1
commit
87599daaac
@ -1,5 +1,21 @@
|
|||||||
import Photos
|
import Photos
|
||||||
|
|
||||||
|
class WrapperAsset: Hashable, Equatable {
|
||||||
|
var asset: Asset
|
||||||
|
|
||||||
|
init(with asset: Asset) {
|
||||||
|
self.asset = asset
|
||||||
|
}
|
||||||
|
|
||||||
|
func hash(into hasher: inout Hasher) {
|
||||||
|
hasher.combine(self.asset.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
static func == (lhs: WrapperAsset, rhs: WrapperAsset) -> Bool {
|
||||||
|
return lhs.asset.id == rhs.asset.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class MediaManager {
|
class MediaManager {
|
||||||
private let _defaults: UserDefaults
|
private let _defaults: UserDefaults
|
||||||
private let _changeTokenKey = "immich:changeToken"
|
private let _changeTokenKey = "immich:changeToken"
|
||||||
@ -7,7 +23,7 @@ class MediaManager {
|
|||||||
init(with defaults: UserDefaults = .standard) {
|
init(with defaults: UserDefaults = .standard) {
|
||||||
self._defaults = defaults
|
self._defaults = defaults
|
||||||
}
|
}
|
||||||
|
|
||||||
@available(iOS 16, *)
|
@available(iOS 16, *)
|
||||||
func _getChangeToken() -> PHPersistentChangeToken? {
|
func _getChangeToken() -> PHPersistentChangeToken? {
|
||||||
guard let encodedToken = _defaults.data(forKey: _changeTokenKey) else {
|
guard let encodedToken = _defaults.data(forKey: _changeTokenKey) else {
|
||||||
@ -91,19 +107,22 @@ class MediaManager {
|
|||||||
let dateFormatter = ISO8601DateFormatter()
|
let dateFormatter = ISO8601DateFormatter()
|
||||||
dateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
|
dateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
|
||||||
|
|
||||||
var updatedArr: [Asset] = []
|
var updatedArr: Set<WrapperAsset> = []
|
||||||
var deletedArr: [String] = []
|
var deletedArr: Set<String> = []
|
||||||
|
|
||||||
for changes in result {
|
for changes in result {
|
||||||
let details = try changes.changeDetails(for: PHObjectType.asset)
|
let details = try changes.changeDetails(for: PHObjectType.asset)
|
||||||
|
|
||||||
let updated = details.updatedLocalIdentifiers.union(details.insertedLocalIdentifiers)
|
let updated = details.updatedLocalIdentifiers.union(details.insertedLocalIdentifiers)
|
||||||
let deleted = details.deletedLocalIdentifiers
|
let deleted = details.deletedLocalIdentifiers
|
||||||
|
|
||||||
let options = PHFetchOptions()
|
let options = PHFetchOptions()
|
||||||
options.includeHiddenAssets = true
|
options.includeHiddenAssets = false
|
||||||
|
|
||||||
let updatedAssets = PHAsset.fetchAssets(withLocalIdentifiers: Array(updated), options: options)
|
let updatedAssets = PHAsset.fetchAssets(withLocalIdentifiers: Array(updated), options: options)
|
||||||
|
|
||||||
updatedAssets.enumerateObjects { (asset, _, _) in
|
updatedAssets.enumerateObjects { (asset, _, _) in
|
||||||
|
|
||||||
let id = asset.localIdentifier
|
let id = asset.localIdentifier
|
||||||
let name = PHAssetResource.assetResources(for: asset).first?.originalFilename ?? asset.title()
|
let name = PHAssetResource.assetResources(for: asset).first?.originalFilename ?? asset.title()
|
||||||
let type: Int64 = Int64(asset.mediaType.rawValue)
|
let type: Int64 = Int64(asset.mediaType.rawValue)
|
||||||
@ -111,7 +130,7 @@ class MediaManager {
|
|||||||
let updatedAt = asset.modificationDate.map { dateFormatter.string(from: $0) }
|
let updatedAt = asset.modificationDate.map { dateFormatter.string(from: $0) }
|
||||||
let durationInSeconds: Int64 = Int64(asset.duration)
|
let durationInSeconds: Int64 = Int64(asset.duration)
|
||||||
|
|
||||||
let domainAsset = Asset(
|
let domainAsset = WrapperAsset(with: Asset(
|
||||||
id: id,
|
id: id,
|
||||||
name: name,
|
name: name,
|
||||||
type: type,
|
type: type,
|
||||||
@ -119,14 +138,16 @@ class MediaManager {
|
|||||||
updatedAt: updatedAt,
|
updatedAt: updatedAt,
|
||||||
durationInSeconds: durationInSeconds,
|
durationInSeconds: durationInSeconds,
|
||||||
albumIds: self._getAlbumIds(forAsset: asset)
|
albumIds: self._getAlbumIds(forAsset: asset)
|
||||||
)
|
))
|
||||||
updatedArr.append(domainAsset)
|
|
||||||
|
updatedArr.insert(domainAsset)
|
||||||
}
|
}
|
||||||
|
|
||||||
deletedArr.append(contentsOf: details.deletedLocalIdentifiers)
|
deletedArr.formUnion(deleted)
|
||||||
}
|
}
|
||||||
|
|
||||||
let delta = SyncDelta(hasChanges: true, updates: updatedArr, deletes: deletedArr)
|
let delta = SyncDelta(hasChanges: true, updates: Array(updatedArr.map { $0.asset }), deletes: Array(deletedArr))
|
||||||
|
|
||||||
completion(.success(delta))
|
completion(.success(delta))
|
||||||
return
|
return
|
||||||
} catch {
|
} catch {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user