I have a class Artist
, and below is a function to create a new artist
and insert it to my library array. Because insertToArtists(artist:)
is a asynchronous function, I have to wrap it in Task
. But I also want my newArtist
to return the artist
just created.
My code is like below, but Xcode told me an error: No 'init' candidates produce the expected contextual result type 'Artist'
func newArtist(name: String, notes: String, artwork: NSImage?) -> Artist {
Task {
let artist = Artist(name: name, notes: notes, artwork: artwork)
await insertToArtists(artist: artist)
return artist
}
}
But if I make my code like this below. It won't work right. It seems that it returns artist
before it's been insertToArtist(artist:)
. How can I return artist
after it's been inserted. I would appreciate your help.
func newArtist(name: String, notes: String, artwork: NSImage?) -> Artist {
let artist = Artist(name: name, notes: notes, artwork: artwork)
Task {
await insertToArtists(artist: artist)
}
return artist
}
CodePudding user response:
Well, it would be useful to know how newArtist
is used, but I believe you will need to make it async as well.
func newArtist(name: String, notes: String, artwork: NSImage?) async -> Artist {
let artist = Artist(name: name, notes: notes, artwork: artwork)
await insertToArtists(artist: artist)
return artist
}
And then use Task
where you are calling newArtist
func whereYouUseNewArtist() {
//YourCode
Task {
//YourCode
x = await newArtist(name: name, notes: notes, artwork: artwork)
//YourCode
}
//YourCode
}
If you need to update your UI with the result of newArtist
, remember to do it in the main thread. You can do it by adding @MainActor
to where you use it. Example:
let artistToShowOnUI: Artist
@MainActor func whereYouUseNewArtist() {
Task {
artistToShowOnUI = await newArtist(name: name, notes: notes, artwork: artwork)
}
}