Skip to content

Commit

Permalink
Convert Dia.save() to main actor
Browse files Browse the repository at this point in the history
  • Loading branch information
lucka-me committed Nov 6, 2021
1 parent f7d5127 commit 169b4e4
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 52 deletions.
23 changes: 11 additions & 12 deletions Shared/Service/Dia.swift
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ class Dia: ObservableObject {
}

@discardableResult
func save(_ raws: [ NominationRAW ], merge: Bool = false) -> Int {
func save(_ raws: [ NominationRAW ], merge: Bool = false) async -> Int {
let existings = nominations()
var count = 0
for raw in raws {
Expand All @@ -106,30 +106,27 @@ class Dia: ObservableObject {
count += 1
}
}
save()
await save()
return count
}

/// Save changes and refresh the UI by refreshing saveID
@MainActor
func save() {
if !viewContext.hasChanges {
return
}
if !viewContext.hasChanges { return }
do {
try viewContext.save()
} catch {
print("[CoreData][Save] Failed: \(error.localizedDescription)")
}
DispatchQueue.main.async {
self.saveID = UUID().uuidString
}
saveID = UUID().uuidString
}

func importNominations(_ data: Data) throws -> Int {
func importNominations(_ data: Data) async throws -> Int {
let decoder = JSONDecoder()
let jsonList = try decoder.decode([ NominationJSON ].self, from: data)
let raws = jsonList.map { NominationRAW(from: $0) }
return save(raws, merge: true)
return await save(raws, merge: true)
}

func exportNominations() -> NominationJSON.Document {
Expand All @@ -138,7 +135,7 @@ class Dia: ObservableObject {
return .init(for: jsons)
}

func importWayfarer(_ data: Data) throws -> Int {
func importWayfarer(_ data: Data) async throws -> Int {
let decoder = JSONDecoder()
let response = try decoder.decode(WayfarerResponse.self, from: data)
let nominations = nominations()
Expand All @@ -157,7 +154,9 @@ class Dia: ObservableObject {
nomination.hasLngLat = true
count += 1
}
save()
if count > 0 {
await save()
}
return count
}

Expand Down
4 changes: 2 additions & 2 deletions Shared/Service/Service.swift
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ final class Service: ObservableObject {
}
}
}
let updateCount = Dia.shared.save(raws) + mergeCount
let updateCount = await Dia.shared.save(raws) + mergeCount
if UserDefaults.Google.sync {
do {
try await upload()
Expand Down Expand Up @@ -204,7 +204,7 @@ final class Service: ObservableObject {
return 0
}
let raws = jsons.map { NominationRAW(from: $0) }
return Dia.shared.save(raws, merge: true)
return await Dia.shared.save(raws, merge: true)
}

private func upload() async throws {
Expand Down
42 changes: 23 additions & 19 deletions iOS/Views/PreferencesView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -201,16 +201,18 @@ fileprivate struct ImportExportView: View {
isPresented: $isPresentedImporter,
allowedContentTypes: NominationJSON.Document.readableContentTypes
) { result in
let message: LocalizedStringKey
do {
let url = try result.get()
let data = try Data(contentsOf: url)
let count = try dia.importNominations(data)
message = "view.preferences.data.nominations.import.success \(count)"
} catch {
message = .init(error.localizedDescription)
Task {
let message: LocalizedStringKey
do {
let url = try result.get()
let data = try Data(contentsOf: url)
let count = try await dia.importNominations(data)
message = "view.preferences.data.nominations.import.success \(count)"
} catch {
message = .init(error.localizedDescription)
}
alert.push(Self.stringImport, message: message)
}
alert.push(Self.stringImport, message: message)
}
.fileExporter(
isPresented: $isPresentedExporter,
Expand Down Expand Up @@ -243,18 +245,20 @@ fileprivate struct ImportExportView: View {
Section(header: Text("view.preferences.data.wayfarer")) {
Button("view.preferences.data.import") {
let json = UIPasteboard.general.string
let message: LocalizedStringKey
if let data = json?.data(using: .utf8) {
do {
let count = try dia.importWayfarer(data)
message = "view.preferences.data.wayfarer.import.success \(count)"
} catch {
message = .init(error.localizedDescription)
Task {
let message: LocalizedStringKey
if let data = json?.data(using: .utf8) {
do {
let count = try await dia.importWayfarer(data)
message = "view.preferences.data.wayfarer.import.success \(count)"
} catch {
message = .init(error.localizedDescription)
}
} else {
message = "view.preferences.data.wayfarer.import.empty"
}
} else {
message = "view.preferences.data.wayfarer.import.empty"
alert.push(Self.stringImport, message: message)
}
alert.push(Self.stringImport, message: message)
}
Link(
"view.preferences.data.wayfarer.link",
Expand Down
44 changes: 25 additions & 19 deletions macOS/PotoriCommands.swift
Original file line number Diff line number Diff line change
Expand Up @@ -138,16 +138,18 @@ fileprivate struct DataCommands: Commands {
isPresented: $isPresentedImporter,
allowedContentTypes: NominationJSON.Document.readableContentTypes
) { result in
let message: String
do {
let url = try result.get()
let data = try Data(contentsOf: url)
let count = try dia.importNominations(data)
message = .init(format: .init(localized: "view.preferences.data.nominations.import.success"), count)
} catch {
message = error.localizedDescription
Task {
let message: String
do {
let url = try result.get()
let data = try Data(contentsOf: url)
let count = try await dia.importNominations(data)
message = .init(format: .init(localized: "view.preferences.data.nominations.import.success"), count)
} catch {
message = error.localizedDescription
}
showAlert(title: .init(localized: "view.preferences.data.import"), message: message)
}
showAlert(title: .init(localized: "view.preferences.data.import"), message: message)
}
.fileExporter(
isPresented: $isPresentedExporter,
Expand All @@ -168,18 +170,20 @@ fileprivate struct DataCommands: Commands {
Menu("view.preferences.data.wayfarer") {
Button("view.preferences.data.import") {
let json = NSPasteboard.general.string(forType: .string)
let message: String
if let data = json?.data(using: .utf8) {
do {
let count = try dia.importWayfarer(data)
message = .init(format: .init(localized: "view.preferences.data.wayfarer.import.success"), count)
} catch {
message = error.localizedDescription
Task {
let message: String
if let data = json?.data(using: .utf8) {
do {
let count = try await dia.importWayfarer(data)
message = .init(format: .init(localized: "view.preferences.data.wayfarer.import.success"), count)
} catch {
message = error.localizedDescription
}
} else {
message = .init(localized: "view.preferences.data.wayfarer.import.empty")
}
} else {
message = .init(localized: "view.preferences.data.wayfarer.import.empty")
showAlert(title: .init(localized: "view.preferences.data.import"), message: message)
}
showAlert(title: .init(localized: "view.preferences.data.import"), message: message)
}
Link(
"view.preferences.data.wayfarer.link",
Expand Down Expand Up @@ -210,13 +214,15 @@ fileprivate extension Commands {

typealias ButtonAction = () -> Void

@MainActor
func showAlert(title: String, message: String) {
let alert = NSAlert()
alert.messageText = title
alert.informativeText = message
alert.runModal()
}

@MainActor
func showConfirmationDialog(
title: String,
message: String,
Expand Down

0 comments on commit 169b4e4

Please sign in to comment.