ModelActor Implementation Changes In Xcode 15 Beta 7

Hi all,

There appears to be some changes to how ModelActors are implemented in Beta 7 of Xcode 15. In Beta 6, we had the DefaultModelExecutor object which we used to assign to the ModelActor's executor property. A simple example is shown below:

final actor SimpleModelActor: ModelActor {
    let executor: any ModelExecutor
    
    init(modelContainer: ModelContainer) {
        let modelContext = ModelContext(modelContainer)
        executor = DefaultModelExecutor(context: modelContext)
    }
    
    func addItem() {
        let newItem = Item(timestamp: Date())
        context.insert(newItem)
        try! context.save() 
    }
....
}

However, it seems that the DefaultModelExecutor class has been removed for Beta 7, without any real replacement. Anyone know how to implement a ModelActor in the new beta?

Thanks in advance.

Accepted Reply

@ModelActor
actor CountryModelActor {
    init(container: ModelContainer) {
        modelContainer = container
        let context = ModelContext(container)
        modelExecutor = DefaultSerialModelExecutor(modelContext: context)
    }
    
    func newItem() {
        let item = Item(timestamp: .now, name: "\(Int.random(in: 0...3))")
        modelContext.insert(item)
        try! modelContext.save()
    }
}

Replies

@ModelActor
actor CountryModelActor {
    init(container: ModelContainer) {
        modelContainer = container
        let context = ModelContext(container)
        modelExecutor = DefaultSerialModelExecutor(modelContext: context)
    }
    
    func newItem() {
        let item = Item(timestamp: .now, name: "\(Int.random(in: 0...3))")
        modelContext.insert(item)
        try! modelContext.save()
    }
}

Actually you can skip the constructor.

@ModelActor
actor CountryModelActor {
    func newItem() {
        let item = Item(timestamp: .now, name: "\(Int.random(in: 0...3))")
        modelContext.insert(item)
        try! modelContext.save()
    }
}

You will get an error Invalid redeclaration of 'init(modelContainer:)' if you define init(container: ModelContainer). Its being created automatically by macro now.