gpt4 book ai didi

swift - 无法访问函数之外、超出范围的结构

转载 作者:行者123 更新时间:2023-11-30 10:32:34 26 4
gpt4 key购买 nike

已编辑来编写整个代码。我想要解决的问题是,一旦我从 Firebase 获取数据,它就会一遍又一遍地显示相同的数据(数组的数量,在本例中为 0、1、2)。正在正确检索数据。

enter image description here

当我在局部变量上更新数组时,它似乎没有正确填充数组,因此我可以在 TableView 中显示帖子时使用它。这是代码:

import UIKit
import Firebase
import FirebaseAuth
import Foundation

class StylerSalonHomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var tableView:UITableView!
var posts = [Post]()

override func viewDidLoad() {
super.viewDidLoad()

tableView = UITableView(frame: view.bounds, style: .plain)

let cellNib = UINib(nibName: "PostTableViewCell", bundle: nil)
tableView.register(cellNib, forCellReuseIdentifier: "postCell")

view.addSubview(tableView)

var layoutGuide:UILayoutGuide

if #available(iOS 11.0, *){
layoutGuide = view.safeAreaLayoutGuide
}

layoutGuide = view.safeAreaLayoutGuide

tableView.leadingAnchor.constraint(equalTo: layoutGuide.leadingAnchor).isActive = true
tableView.topAnchor.constraint(equalTo: layoutGuide.topAnchor).isActive = true
tableView.trailingAnchor.constraint(equalTo: layoutGuide.trailingAnchor).isActive = true
tableView.bottomAnchor.constraint(equalTo: layoutGuide.bottomAnchor).isActive = true

tableView.delegate = self
tableView.dataSource = self
tableView.tableFooterView = UIView()

observe()

tableView.reloadData()

}


func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return posts.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostTableViewCell
cell.set(post: posts[indexPath.row])
return cell
}

internal func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 180
}



@IBAction func handleLogout(_ target: UIBarButtonItem) {
try! Auth.auth().signOut()
self.dismiss(animated: false, completion: nil)
}


func observe() {
let postsRef = Database.database().reference(withPath: "post")

postsRef.observe(.value, with: { snapshot in
var tempPosts = [Post]()

for child in snapshot.children {
if let childSnapshot = child as? DataSnapshot,
let data = childSnapshot.value as? [String:Any],
let first_name = data["Author"] as? String,
let postTitle = data["title"] as? String,
let postDescription = data["description"] as? String,
let postUrl = data["postUrl"] as? String,
let postAddress = data["Address"] as? String,
let url = URL(string:postUrl)
{
let post = Post(author: first_name, postTitle: postTitle, postDescription: postDescription, postUrl: url, postAddress: postAddress)
tempPosts.append(post)

}
}

self.posts = tempPosts

// HERE IT WORKS
print(self.posts[0].postTitle , " 0")
print(self.posts[1].postTitle , " 1")

self.tableView.reloadData()
})
// HERE IT DOESN'T WORK
print(self.posts[0].postTitle , " 0")
}


func getDateFromTimeStamp(timestamp : Double) -> String {
let date = Date(timeIntervalSince1970: timestamp)
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(abbreviation: "GMT") //Set timezone that you want
dateFormatter.locale = NSLocale.current
dateFormatter.dateFormat = "HH:mm" //Specify your format that you want
let strDate = dateFormatter.string(from: date)

return strDate
}

}

我必须访问我的数据并将其存储到var posts = [Post]()的函数是observe(),但是如果您注意到那里的注释,我无法调用该函数之外的数组,这可能是问题所在吗?当我这样做时,它会显示:线程 1: fatal error :索引超出范围

我认为错误是访问 postsRef.observe(.value, with: { snapshot in

之外的数据

最佳答案

如果没有看到您的所有代码,我无法完全确定,但我认为这是一个时间问题。

在运行 observe() 之前,数据库上不会有任何观察者,并且它不会在 updatePosts.posts 数组中填充任何数据,直到(1) 数据库发生更改,触发快照;(2) 闭包完成对快照的处理。

你在哪里调用observe()?是在 viewDidLoad 运行并尝试打印数组内容之前吗?您是否确信在 viewDidLoad 运行时会收到并处理快照?否则,在 viewDidLoad 中,您将尝试对 posts 数组中尚不存在的项目建立索引,这就是为什么您会遇到 index out of range 错误。

您想在 viewDidLoad 中实现什么目标,这意味着您需要访问 posts 数组,因为可能有另一种方法可以避免此问题?

关于swift - 无法访问函数之外、超出范围的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58828583/

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