Я борюсь с проблемой, заключающейся в том, что когда я получаю данные из сеанса с использованием инфраструктуры многорангового подключения, я хочу обновить данные и мгновенно перезагрузить таблицу контроллера представления.
Вот мои коды для функции didReceiveData MPCHandler:
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
NSLog("%@", "didReceive: \(data)")
if var dict: [NSDictionary] = NSKeyedUnarchiver.unarchiveObject(with: data) as? [NSDictionary]{
let d = dict.removeFirst()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.winnerDataController.syncWinnerFromDictionary(d: dict)
}
}
Для функции синхронизации в WinnerDataController
func syncWinnerFromDictionary(d: NSDictionary){
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let entityDescription = NSEntityDescription.entity(forEntityName: "Winner", in: context)!
let winner: Winner = NSManagedObject(entity: entityDescription, insertInto: context) as! Winner
winner.setValue(d.value(forKey: "index"), forKey: "index")
winner.setValue(d.value(forKey: "dept"), forKey: "dept")
winner.setValue(d.value(forKey: "name"), forKey: "name")
save()
appDelegate.resultViewController.tableView.reloadData()
}
Я хочу обновить и перезагрузить таблицу resultViewContoller при получении данных. Однако когда дело доходит до appDelegate.resultViewController.tableView.reloadData()
, консоль выдает fatal error: unexpectedly found nil while unwrapping an Optional value
. Я потратил весь день на то, чтобы понять, почему tableView равен нулю, но до сих пор не придумал.
Может кто-нибудь помочь плз. Спасибо
Я попробовал следующие коды, предоставленные @Hitesh Sultaniya: NotificationCenter.default.addObserver(self, selector: #selector(testing), name: NSNotification.Name(rawValue: "syncWinner"), object: nil)
и func testing(notification: Notification){
print("testing")
self.tableView.reloadData()
}
в контроллере представления результатов. Кроме того, NotificationCenter.default.post(name: NSNotification.Name(rawValue: "syncWinner"), object: nil)
в WinnerDataController.
В консоли печатается "testing". Однако через несколько секунд отображается сообщение «Это приложение модифицирует механизм автомакета из фонового потока после того, как доступ к механизму был получен из основного потока. Это может привести к повреждению механизма и странным сбоям».
Затем я попробовал это:
func testing(notification: Notification){
DispatchQueue.global(qos: .userInitiated).async{
self.tableView.reloadData()
}
}
Теперь ошибка не отображается. Но таблица еще не перезагружена...