Я хочу понять , почему использование структуры вызывает эту проблему, а класс - нет. Я столкнулся с проблемой при добавлении элементов в массив и при наличии наблюдателя загрузить таблицу. Вот коды:
Order.swift - заказанные товары
struct Order {
var menuItems: [MenuItem]
init(menuItems: [MenuItem] = []) {
self.menuItems = menuItems
}
}
MenuController.swift - содержит заказ и общий экземпляр
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 - экран заказа
@IBAction func orderButtonTapped(_ sender: UIButton) {
MenuController.shared.order.menuItems.append(menuItem)
}
OrderTableViewController.swift - экран упорядоченных товаров
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
}
Теперь я допустил ошибку проектирования, когда MenuController должен быть классом вместо структуры, потому что мы собираемся делиться экземпляром MenuController по всему приложению, поэтому он должен быть ссылочным типом. Использование класса решило проблему одновременного доступа.
Что меня смущает:
Почему типизированный (struct) MenuController вызывает эту проблему одновременного доступа, когда наблюдатель пытается загрузить tableView.
Надеюсь, кто-нибудь сможет объяснить. ТИА!