gpt4 book ai didi

ios - 如何使用 Multipeer Connectivity (Swift 3) 在 session 中通过 didReceiveData() 调用 table.reloadData

转载 作者:行者123 更新时间:2023-11-28 06:07:57 25 4
gpt4 key购买 nike

我正在努力解决一个问题,当我使用 Multipeer Connectivity 框架从 session 接收数据时,我想立即更新数据并重新加载 View Controller 的表。

这是我的 MPCHandler 的 didReceiveData 函数的代码:

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: unwrapping an Optional value unwhile unwrappingly found nil。我花了一整天的时间来弄清楚为什么 tableView 为 nil,但仍然没有任何想法。

请有人帮忙。谢谢

我尝试了@Hitesh Sultaniya 提供的以下代码:NotificationCenter.default.addObserver(self, selector: #selector(testing), name: NSNotification.Name(rawValue: "syncWinner"), object: nil )func testing(notification: Notification){
打印(“测试”)
self.tableView.reloadData()
}
在结果 View Controller 中。此外,WinnerDataController 中的 NotificationCenter.default.post(name: NSNotification.Name(rawValue: "syncWinner"), object: nil)

在控制台中,打印了“testing”。然而,几秒钟后,“从主线程访问引擎后,此应用程序正在从后台线程修改自动布局引擎。这可能导致引擎损坏和奇怪的崩溃”显示。

然后,我尝试了这个:

func testing(notification: Notification){
DispatchQueue.global(qos: .userInitiated).async{
self.tableView.reloadData()
}

现在,没有显示错误。但是该表仍未重新加载...

最佳答案

在resultViewController中你可以设置Notification observer来重新加载tableview

可以这样设置

//在结果 View Controller 中注册并添加观察者

 NotificationCenter.default.addObserver(self, selector: #selector(self.reloadTableView(_:)), name: NSNotification.Name(rawValue: "<Your Notfication Name>"), object: nil)

// handle notification
func reloadTableView(_ notification: NSNotification) {

//relaod your table view
}

当您完成接收数据后,您可以像这样发布通知

NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: nil)

所以这将发布您在结果 View Controller 中设置的通知,然后您的任务将被执行

注意:这只是伪代码,所以可能包含错误

如果您的应用程序对 UI 进行了更改,那么在执行此任务时您对 UI 进行了更改而且我认为您还需要在重新加载 TableView 之前再次从数据库中获取数据,因为根据您提供的相关代码,您可以直接重新加载表。您可以像这样检查当前线程,

 if (Thread.isMainThread == true)
{
//Perform UI Task
}
else
{
//Dispatch for main queue with synchronous not asynchronous and then update the UI
}

希望对你有帮助

关于ios - 如何使用 Multipeer Connectivity (Swift 3) 在 session 中通过 didReceiveData() 调用 table.reloadData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47687844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com