Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在进行第二次Json调用Swift 3后在UITableview中重新加载数据_Json_Uitableview_Swift3_Tableview - Fatal编程技术网

如何在进行第二次Json调用Swift 3后在UITableview中重新加载数据

如何在进行第二次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

我正在发出JSON请求,如果请求完成,我将使用JSON数据导航页面到我的表视图控制器,一切正常,但当我进行第二次调用以加载更多单元格时,我无法重新加载数据,这是我的表视图控制器的代码,我正在进行第二次调用

    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欢迎伙伴:)