Thank you so much for the reply, I get a network response and the booking does successfully get retrieved, only I have to go in to one of the booking types, which triggers another fetchdata function call before the list is appended with the new booking on the UI, if I then go back to the booking type list, the counter then correctly states the number of new bookings, the AnyBooking is a class
import Foundation
import CoreData
class AnyBooking: Identifiable, Equatable, Hashable {
let id: String
var booking: any BookingProtocol
var displayTitle: String { booking.displayTitle }
var displaySubtitle: String? { booking.displaySubtitle }
var details: [String: String] { booking.details }
var orderedDetails: [(String, String)] { booking.orderedDetails }
var calendarEventIdentifier: String? {
get { booking.calendarEventIdentifier }
set { booking.calendarEventIdentifier = newValue }
}
var bookingType: String { booking.bookingType }
init(_ booking: any BookingProtocol) {
self.booking = booking
self.id = booking.id
print("AnyBooking initialized with ID: \(self.id)") // Log ID on initialization
}
init(managedObject: NSManagedObject) {
if let barBooking = managedObject as? BarBookingEntity {
self.booking = BarBooking(coreDataEntity: barBooking)
} else if let eventBooking = managedObject as? EventBookingEntity {
self.booking = EventBooking(coreDataEntity: eventBooking)
} else if let playlistBooking = managedObject as? PlaylistBookingEntity {
self.booking = PlaylistBooking(coreDataEntity: playlistBooking)
} else if let quoteBooking = managedObject as? QuoteBookingEntity {
self.booking = QuoteBooking(coreDataEntity: quoteBooking)
} else if let weddingBooking = managedObject as? WeddingBookingEntity {
self.booking = WeddingBooking(coreDataEntity: weddingBooking)
} else {
fatalError("Unknown booking type")
}
self.id = self.booking.id
print("AnyBooking initialized with ID: \(self.id) from CoreData") // Log ID on initialization from CoreData
}
static func == (lhs: AnyBooking, rhs: AnyBooking) -> Bool {
return lhs.id == rhs.id
}
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
func addToCalendar(completion: @escaping (Bool, String?, Error?) -> Void) {
booking.addToCalendar { success, message, error in
DispatchQueue.main.async {
completion(success, message, error)
}
}
}
}
extension AnyBooking {
var bookingDate: String? {
switch self.booking {
case let barBooking as BarBooking:
return barBooking.bDate
case let eventBooking as EventBooking:
return eventBooking.eDate
case let playlistBooking as PlaylistBooking:
return playlistBooking.pDOccasion
case let quoteBooking as QuoteBooking:
return quoteBooking.qDateEvent
case let weddingBooking as WeddingBooking:
return weddingBooking.wDate
default:
return nil
}
}
}
extension AnyBooking {
var phoneNumber: String? {
switch self.booking {
case let barBooking as BarBooking:
return barBooking.bNumber
case let eventBooking as EventBooking:
return eventBooking.eNumber
case let quoteBooking as QuoteBooking:
return quoteBooking.qNumber
case let weddingBooking as WeddingBooking:
return weddingBooking.wNumber
default:
return nil
}
}
}