- Refactor BookmarksView with better error handling and loading states - Optimize BookmarkLabelsViewModel with cached properties and reduced recomputation - Fix Core Data thread safety in LabelsRepository with performAndWait - Enhance TagManagementView with sorted selected labels display - Clean up ShareBookmarkViewModel comments - Update localization strings for error states - Bump build version to 19 These changes improve overall app performance and user experience across bookmark management workflows.
44 lines
1.2 KiB
Swift
44 lines
1.2 KiB
Swift
import Foundation
|
|
import CoreData
|
|
|
|
class LabelsRepository: PLabelsRepository {
|
|
private let api: PAPI
|
|
|
|
private let coreDataManager = CoreDataManager.shared
|
|
|
|
init(api: PAPI) {
|
|
self.api = api
|
|
}
|
|
|
|
func getLabels() async throws -> [BookmarkLabel] {
|
|
let dtos = try await api.getBookmarkLabels()
|
|
try? await saveLabels(dtos)
|
|
return dtos.map { $0.toDomain() }
|
|
}
|
|
|
|
func saveLabels(_ dtos: [BookmarkLabelDto]) async throws {
|
|
for dto in dtos {
|
|
if !tagExists(name: dto.name) {
|
|
dto.toEntity(context: coreDataManager.context)
|
|
}
|
|
}
|
|
try coreDataManager.context.save()
|
|
}
|
|
|
|
private func tagExists(name: String) -> Bool {
|
|
let fetchRequest: NSFetchRequest<TagEntity> = TagEntity.fetchRequest()
|
|
fetchRequest.predicate = NSPredicate(format: "name == %@", name)
|
|
|
|
var exists = false
|
|
coreDataManager.context.performAndWait {
|
|
do {
|
|
let results = try coreDataManager.context.fetch(fetchRequest)
|
|
exists = !results.isEmpty
|
|
} catch {
|
|
exists = false
|
|
}
|
|
}
|
|
return exists
|
|
}
|
|
}
|