如何在进行第二次Json调用Swift 3后在UITableview中重新加载数据
我正在发出JSON请求,如果请求完成,我将使用JSON数据导航页面到我的表视图控制器,一切正常,但当我进行第二次调用以加载更多单元格时,我无法重新加载数据,这是我的表视图控制器的代码,我正在进行第二次调用如何在进行第二次Json调用Swift 3后在UITableview中重新加载数据,json,uitableview,swift3,tableview,Json,Uitableview,Swift3,Tableview,我正在发出JSON请求,如果请求完成,我将使用JSON数据导航页面到我的表视图控制器,一切正常,但当我进行第二次调用以加载更多单元格时,我无法重新加载数据,这是我的表视图控制器的代码,我正在进行第二次调用 var listData:[String] = [] var videoIDData:[String] = [] var valueKeyData:[String] = [] var nextPageToken:String? var titleName
var listData:[String] = []
var videoIDData:[String] = []
var valueKeyData:[String] = []
var nextPageToken:String?
var titleNamee:[String] = []
var videoIDD :[String] = []
var valueKeyy :[String] = []
var PrevPageToken:String?
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return listData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "VideoCell", for: indexPath) as! VideoTableViewCell
cell.videoTitle.text = listData[indexPath.row]
let url = NSURL(string: valueKeyData[indexPath.row])
let dataaa = NSData(contentsOf: url! as URL)
let image = UIImage(data: dataaa! as Data)
cell.videoThumnailImageView.image = image
if (indexPath.row == listData.count - 1)
{
makeGetCall()
}
return cell
}
func makeGetCall() {
// Set up the URL request
var pageToken:String = (pageToken)
let todoEndpoint: String = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50\(pageToken)&playlistId=\(id)_ItOZ8WBF5_SI_SrSN3_F&\(key)"
guard let url = URL(string: todoEndpoint) else {
print("Error: cannot create URL")
return
}
let urlRequest = URLRequest(url: url)
// set up the session
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
// make the request
let task = session.dataTask(with: urlRequest) {
(data, response, error) in
// check for any errors
guard error == nil else {
print("error calling GET on /todos/1")
print(error)
return
}
guard let responseData = data else {
print("Error: did not receive data")
return
}
// parse the result as JSON, since that's what the API provides
do {
guard let jsonObject = try JSONSerialization.jsonObject(with: responseData, options: []) as? [String : AnyObject] else {
print("error trying to convert data to JSON")
return
}
self.PrevPageToken = jsonObject["prevPageToken"] as? String
self.nextPageToken = jsonObject["nextPageToken"] as? String
if let itemsArray = jsonObject["items"] as? [[String:AnyObject]]{
for snippetArray in itemsArray{
if var snippet = snippetArray["snippet"] as? [String : AnyObject]{
if let titleItems = snippet["title"] as? String{
self.titleNamee += [titleItems]
}
if let thumbnail = snippet["thumbnails"] as? [String : AnyObject]{
if let highValue = thumbnail["high"] as? [String : AnyObject]{
if let urlValueKey = highValue ["url"] as? String{
self.valueKeyy += [urlValueKey]
}
}
}
if let resource = snippet["resourceId"] as? [String : AnyObject]{
if let videoId = resource["videoId"] as? String{
// self.videoIDD.append(videoId)
self.videoIDD += [videoId]
}
}
}
}
}
} catch {
print("error trying to convert data to JSON")
return
}
}
task.resume()
DispatchQueue.main.async{
self.tableView.reloadData()
}
}
}
您在错误的位置重新加载
tableView
,您需要在for循环之后的完成块中重新加载它,因为完成块将调用async,所以请删除tableView
的当前重新加载代码,并将其放在for循环之后
for snippetArray in itemsArray{
if var snippet = snippetArray["snippet"] as? [String : AnyObject]{
if let titleItems = snippet["title"] as? String{
self.titleNamee += [titleItems]
}
if let thumbnail = snippet["thumbnails"] as? [String : AnyObject]{
if let highValue = thumbnail["high"] as? [String : AnyObject]{
if let urlValueKey = highValue ["url"] as? String{
self.valueKeyy += [urlValueKey]
}
}
}
if let resource = snippet["resourceId"] as? [String : AnyObject]{
if let videoId = resource["videoId"] as? String{
// self.videoIDD.append(videoId)
self.videoIDD += [videoId]
}
}
}
}
//Reload your table here
DispatchQueue.main.async{
self.tableView.reloadData()
}
注意:与当前正在创建的多个数组不同,您需要做的是使用所有这些属性创建一个自定义类或结构,并创建该自定义类或结构对象的数组
编辑:我没有看到您在cellForRowAt
中调用此方法。不要这样做,因为单元格将被重用,这就是您的UI被卡住的原因,所以请从cellForRowAt
中删除调用代码,如果您想进行类似分页的操作,可以这样使用scrollViewDelegate
方法
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if((scrollView.contentOffset.y + scrollView.frame.size.height) == scrollView.contentSize.height)
{
self.makeGetCall()
}
}
另外,在发出API请求时最好显示一些进程指示器。您在错误的位置重新加载tableView
,您需要在for循环之后的完成块内重新加载它,因为完成块将调用async,因此,删除当前的重新加载代码tableView
,并将其放在for循环之后
for snippetArray in itemsArray{
if var snippet = snippetArray["snippet"] as? [String : AnyObject]{
if let titleItems = snippet["title"] as? String{
self.titleNamee += [titleItems]
}
if let thumbnail = snippet["thumbnails"] as? [String : AnyObject]{
if let highValue = thumbnail["high"] as? [String : AnyObject]{
if let urlValueKey = highValue ["url"] as? String{
self.valueKeyy += [urlValueKey]
}
}
}
if let resource = snippet["resourceId"] as? [String : AnyObject]{
if let videoId = resource["videoId"] as? String{
// self.videoIDD.append(videoId)
self.videoIDD += [videoId]
}
}
}
}
//Reload your table here
DispatchQueue.main.async{
self.tableView.reloadData()
}
注意:与当前正在创建的多个数组不同,您需要做的是使用所有这些属性创建一个自定义类或结构,并创建该自定义类或结构对象的数组
编辑:我没有看到您在cellForRowAt
中调用此方法。不要这样做,因为单元格将被重用,这就是您的UI被卡住的原因,所以请从cellForRowAt
中删除调用代码,如果您想进行类似分页的操作,可以这样使用scrollViewDelegate
方法
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if((scrollView.contentOffset.y + scrollView.frame.size.height) == scrollView.contentSize.height)
{
self.makeGetCall()
}
}
另外,在发出API请求时,最好显示一些流程指示器。您必须尝试使用模型类
代替多数组
所有要在表视图中传递的内容,在获得第二个JSON
后,您必须在main dispatch
因为块是异步的,所以无法执行表重新加载
。我已经创建了NSObject自定义类,但我不知道如何在此方法中使用此类。。有什么帮助吗…??您必须尝试使用模型类
代替多数组
表视图中要传递的所有内容,在获得第二个JSON
后,您必须在主调度
中调用表重新加载代码,因为块是异步的,这就是为什么无法执行表格重新加载
。我已经创建了NSObject自定义类,但我不知道如何在此方法中使用此类。。有什么帮助吗?谢谢你的回复。。。我试过这样做,但还是没有重新加载数据。。它总是卡在最后一个手机上。。。。但当我打印每个阵列时,它会显示数据…@User786你说它卡住是什么意思?它会使应用程序崩溃吗?如果它在cellForRowAt
处崩溃,并且在使用indexPath.row订阅数组的行中有一个,那么所有数组都没有相等的对象,也没有崩溃。。。。当我向上滚动时,它会死机,它的调用函数makeGetCall()再次出现。。。。当我调试函数在所有数组中平等地解析数据时。。。但不是重新装电池是的。。。谢谢你的帮助和回复。。。它可以在表视图上重新加载数据,但唯一的问题是阻塞n然后重新加载数据。。。但至少它能工作…@User786欢迎伴侣:)谢谢你的回复。。。我试过这样做,但还是没有重新加载数据。。它总是卡在最后一个手机上。。。。但当我打印每个阵列时,它会显示数据…@User786你说它卡住是什么意思?它会使应用程序崩溃吗?如果它在cellForRowAt
处崩溃,并且在使用indexPath.row订阅数组的行中有一个,那么所有数组都没有相等的对象,也没有崩溃。。。。当我向上滚动时,它会死机,它的调用函数makeGetCall()再次出现。。。。当我调试函数在所有数组中平等地解析数据时。。。但不是重新装电池是的。。。谢谢你的帮助和回复。。。它可以在表视图上重新加载数据,但唯一的问题是阻塞n然后重新加载数据。。。但至少它起作用了…@User786欢迎伙伴:)