gpt4 book ai didi

swift - 无法保存数据并从关闭中重新加载 TableView

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

我是 Swift 的新手。我连接到 websocket(使用 Starscream),我正在等待接收此方法中的文本或事件:

func websocketDidReceiveMessage(socket: WebSocketClient, text: String)

当我收到一个事件(只是 ID)时,我从另一个 View Controller 触发 func fetchInfoAboutInvitations(text: String);此函数引用 http 请求(从服务器获取有关事件的所有信息),此函数带有 completion:

func gettingInfoAboutInvitationAfterSocket(invitationId: String, completion: @escaping (Invitations) -> Void)

然后我返回到 fetchInfoAboutInvitations 函数,以便尝试:

info.getInfoAboutInvitationAfterSocket(invitationId: text)
{ (invitation) in
print("some inv: \(invitation)") // -- here i got data
self.arrList.append(invitation)
DispatchQueue.main.async {
self.tableViewController.reloadData()
}

关于这个:

var arrList = [Invitations]() {
didSet {
print("arrList: \(arrList)")
}
}

我打印了我的数据,但 tableview 是空的。如果我重新运行我的应用程序,我的 tableview 将不为空。另一个功能工作正常:

func getCurrentEvent() {
currentInvitations.getCurrentInvitations { (value) in
print("currentInv value get CURINVI: \(value)")
self.arrList.append(value)
DispatchQueue.main.async {
self.tableViewController.reloadData()
}
}
}

我的 viewDidLoad:

override func viewDidLoad() {
super.viewDidLoad()
tableViewController.delegate = self
tableViewController.dataSource = self
getCurrentEvent()
}

我猜我不能在 var arrList = Invitations 中附加数据的原因是因为我在 viewDidLoad 中没有 func fetchInfoAboutInvitations(text: String),但是我不能添加它,因为它是一个闭包

更新:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arrList.count
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableViewController.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? EventControllerCell {
cell.nameLabel.text = arrList[indexPath.row].id
return cell
}
return UITableViewCell()
}

更新 #2,添加一些细节:在这里我从 websocket(服务器)获取事件

func websocketDidReceiveMessage(socket: WebSocketClient, text: String) {
print("websocketDidReceiveMessage text: \(text)")
do {
let welcome = try? JSONDecoder().decode(Welcome.self, from: text.data(using: .utf8)!)
print("welcome: \(String(describing: welcome))")
print("welcome dataDataId: \(String(describing: welcome?.data.data.objectID))")
print("welcome eventType: \(String(describing: welcome?.data.eventType))")

if let invitationId = welcome?.data.data.objectID {

let event = EventController()
event.fetchInfoAboutInvitations(text: invitationId)

}
}

然后我触发:

func fetchInfoAboutInvitations(text: String) {
let info = InfoAboutInvitation()
info.getInfoAboutInvitationAfterSocket(invitationId: text) { (invitation) in
print("some inv: \(invitation)")
self.arrList.append(invitation)
DispatchQueue.main.async {
self.tableViewController.reloadData()
}
}
}

它的完成请求:

func getInfoAboutInvitationAfterSocket (invitationId: String, completion: @escaping (Invitations) -> Void) {

guard var urlComp = URLComponents(string: "") else {return}
urlComp.path = ""
guard let url = urlComp.url else { return }

var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("a")
request.addValue("", forHTTPHeaderField: "")

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
if error != nil {
print("URLSession error")
print(error!)
}

guard let data = data else {
print("data is empty")
return
}

do {
let getData = try! JSONDecoder().decode(Invite.self, from: data)

let invitionData = Invitations(id: getData.id, initiator: getData.initiator, receiver: getData.receiver, group: getData.group, created: nil, status: getData.status, replieadAt: getData.replieadAt)
print("info about invitationData (infAbout): \(invitionData)")
completion(invitionData)
} catch let err {
print(err)
}

}
task.resume()
}

如果问题不清楚,有人可以告诉我如何用另一种方式实现这一点吗?我不知道如何将它与委托(delegate)\协议(protocol)一起使用(以及如何实现它)。

我在另一台 PC 上运行应用程序,现在我在 tableView 中有 null,当关闭工作时:

func fetchInfoAboutInvitations(text: String) {

info.getInfoAboutInvitationAfterSocket(invitationId: text) { (invitation) in
print("some inv: \(invitation)")
self.arrList.append(invitation)
DispatchQueue.main.async {
self.tableViewController.reloadData() // - here I got nil
}
}
}

最佳答案

如果您的 tableViewController 是 UITableViewController 的一个实例,您需要在 UITableViewController 的 tableView 属性上调用 reloadData(),例如 self.tableViewController.tableView .reloadData()

关于swift - 无法保存数据并从关闭中重新加载 TableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57316132/

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