Hello all I have a question with ModelActor, this my model, I have N conversation and we have N User
@Model
class Conversation {
@Attribute(.unique)
var id: UUID
var name: String
var user: User
var messages: [Message]
init(name: String) {
self.id = UUID()
self.name = name
}
}
@Model
class User {
@Attribute(.unique)
var id: UUID
var name: String
init(name: String) {
self.id = UUID()
self.name = name
}
}
and to avoid dataRace I want to use @ModelActor macro
If I understand correctly, this will allow me to serialize my calls in the database.
But should I have one ModelActor
or two ModelActor
?
One ModelActor will managed all my insert and get, like this I am sure that all my insert and get are serialized and we have no DataRace
@ModelActor
actor DataBase {
static let shared = DataBase()
private init?() {
guard let modelContainer = try? ModelContainer(for: Conversation.self, User.self) else { return nil }
self.init(modelContainer:modelContainer)
}
func newUser() {
modelContext.insert(User(name: "name"))
try? modelContext.save()
}
func getUser() {
let descriptor = FetchDescriptor<User>()
let value = try? modelContext.fetch(descriptor)
}
func newConvesation() {
}
func getAllConversation() {
}
}
But I want to split my code and avoid to have a big DataBase class
There is a way to split my DataBase to UserDataBase and ConversationDataBase, and be sure to be alway serialized ?
I was thinking to have 2 ModelContainer:
let modelContainer = try? ModelContainer(for: Conversation.self)
and
let modelContainer = try? ModelContainer(for: User.self)
in 2 DataBase actor but If I do like this, conversation can keep a reference with user ? I was not sure ?
I don't know what is the best solution here
Or I need to keep all my code in one actor if I want to user ModlActor
Thanks in advance