I want to understand why using a struct is causing this issue and a class does not. I encountered the issue when appending elements to array and having an observer load a table. Here are the codes:
Order.swift - items ordered
struct Order {
var menuItems: [MenuItem]
init(menuItems: [MenuItem] = []) {
self.menuItems = menuItems
}
}
MenuController.swift - contains the order and a shared instance
struct MenuController {
static var shared: MenuController = MenuController()
static let orderNotification = Notification.Name("MenuController.orderUpdated")
var order = Order() {
didSet {
NotificationCenter.default.post(name: MenuController.orderNotification,
object: nil)
}
}
MenuItemViewController.swift - ordering screen
@IBAction func orderButtonTapped(_ sender: UIButton) {
MenuController.shared.order.menuItems.append(menuItem)
}
OrderTableViewController.swift - items ordered screen
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(tableView,
selector: #selector(UITableView.reloadData),
name: MenuController.orderNotification, object: nil)
}
...
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return MenuController.shared.order.menuItems.count //Simultaneous access error thrown here
}
Now, I made a design mistake where MenuController should be a class instead of a struct because we're gonna be sharing MenuController instance throughout the app hence it should be a reference type. Using a class solved the simultaneous access issue.
What I am confused about is : Why is a value-typed (struct) MenuController causing this simultaneous access issue when observer try to load the tableView.
Hope someone can explain. TIA!