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
Ios 在Swift中,从JSON加载的tableView数据只加载80%的时间_Ios_Json_Swift_Uitableview_Tableview - Fatal编程技术网

Ios 在Swift中,从JSON加载的tableView数据只加载80%的时间

Ios 在Swift中,从JSON加载的tableView数据只加载80%的时间,ios,json,swift,uitableview,tableview,Ios,Json,Swift,Uitableview,Tableview,我正在用JSON数据填充我的tableView,大多数时候数据都会显示出来,但由于一些奇怪的原因,其他时候却没有。我在Chrome中测试了JSON数据,信息就在那里。我还做了打印声明,在信息下载后打印信息,并且看起来下载正确。我不明白为什么80%的时间数据正确地填充了tableView,而20%的时间数据没有。这是我的代码示例,有更多的单元格,但在本例中,我将其缩短为2: var task : NSURLSessionTask? var newURL : String?

我正在用JSON数据填充我的tableView,大多数时候数据都会显示出来,但由于一些奇怪的原因,其他时候却没有。我在Chrome中测试了JSON数据,信息就在那里。我还做了打印声明,在信息下载后打印信息,并且看起来下载正确。我不明白为什么80%的时间数据正确地填充了tableView,而20%的时间数据没有。这是我的代码示例,有更多的单元格,但在本例中,我将其缩短为2:

    var task : NSURLSessionTask?
    var newURL : String? 
    var bannerArray: [String] = []
    var overViewArray: [String] = []

override func viewDidLoad() {
    super.viewDidLoad()

    getJSON(newURL!)

  }

      func getJSON (urlString: String) {

        let url = NSURL(string: urlString)!
        let session = NSURLSession.sharedSession()
        task = session.dataTaskWithURL(url) {(data, response, error) in
          dispatch_async(dispatch_get_main_queue()) {
            if (error == nil) {
              self.updateDetailShowInfo(data)
            }
            else {
              "Not getting JSON"
            }
          }
        }
        task!.resume()
      }


     func updateDetailShowInfo (data: NSData!) {
        do {
          let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary

          guard let banner = jsonResult["banner"] as? String,
          let overview = jsonResult["overview"] as? String 
          else { return }
          _ = ""

          print(overview)

          bannerArray.append(banner)
          overViewArray.append(overview)
     }
        catch {
          print("It ain't working")
        }
        self.DetailTvTableView.reloadData()
        }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 2
      }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        switch section {
        case 0: return bannerArray.count
        case 1: return overViewArray.count
        default: fatalError("Unknown Selection")
        }
      }

      override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = UITableViewCell()

        switch indexPath.section {

        case 0:
          let cell = tableView.dequeueReusableCellWithIdentifier("bannerCell", forIndexPath: indexPath) as! BannerCell
          cell.bannerImage.sd_setImageWithURL(NSURL(string: bannerArray[indexPath.row]))
          self.DetailTvTableView.rowHeight = 100
          DetailTvTableView.allowsSelection = false
          return cell

        case 1:
          let cell = tableView.dequeueReusableCellWithIdentifier("overviewCell", forIndexPath: indexPath) as! OverviewCell
          let overViewText = overViewArray[indexPath.row]
          if overViewText != "" {
            cell.overView.text = overViewText
          } else {
            cell.overView.text = "N/A"
          }
          self.DetailTvTableView.rowHeight = 200

          print(overViewArray[indexPath.row])
          return cell

     default: ""
        }
        return cell
      }

我只是在网上做这件事。我认为有一些错误。您需要自己调试它们

您对获取JSON和GCD的理解是完全错误的。我相信这些代码是你从网上得到的。去读什么是
dispatch\u async

基本上,您需要创建会话来获取JSON数据,您已经正确地完成了这项工作,但是,在NSJSONSerialization中,您需要将它们存储在变量中并将其附加到数组中。这是异步获取的。您的dispatch\u async将以串行方式重新加载数据

func getJSON (urlString: String) {
    let url = NSURL(string: urlString)!
    let session = NSURLSession.sharedSession()
    task = session.dataTaskWithURL(url) {(data, response, error) in
    let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
        guard let banner = jsonResult["banner"] as? String,
        let overview = jsonResult["overview"] as? String 

        bannerArray.append(banner)
        overViewArray.append(overview)
     } dispatch_async(dispatch_get_main_queue()) {
            if (error == nil) {
              self.DetailTvTableView.reloadData()
            }
            else {
              "Not getting JSON"
            }
          }
    catch {
        print("It ain't working")
            }

            }
        }
        task!.resume()
}

我只是在网上做这件事。我认为有一些错误。您需要自己调试它们

您对获取JSON和GCD的理解是完全错误的。我相信这些代码是你从网上得到的。去读什么是
dispatch\u async

基本上,您需要创建会话来获取JSON数据,您已经正确地完成了这项工作,但是,在NSJSONSerialization中,您需要将它们存储在变量中并将其附加到数组中。这是异步获取的。您的dispatch\u async将以串行方式重新加载数据

func getJSON (urlString: String) {
    let url = NSURL(string: urlString)!
    let session = NSURLSession.sharedSession()
    task = session.dataTaskWithURL(url) {(data, response, error) in
    let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
        guard let banner = jsonResult["banner"] as? String,
        let overview = jsonResult["overview"] as? String 

        bannerArray.append(banner)
        overViewArray.append(overview)
     } dispatch_async(dispatch_get_main_queue()) {
            if (error == nil) {
              self.DetailTvTableView.reloadData()
            }
            else {
              "Not getting JSON"
            }
          }
    catch {
        print("It ain't working")
            }

            }
        }
        task!.resume()
}

你能定义“不工作”吗?代码的哪些部分在工作时运行或不运行,哪些部分不运行?tableView似乎没有显示JSON数据。它根本没有显示任何单元格。奇怪的是,它只是偶尔会这样做,大部分时间都在工作。所以它仍然在加载JSON,只是没有显示它?也就是说,
updateDetailShowInfo
仍在被调用且工作正常?是的,尽管出于某种奇怪的原因,self.DetailTvTableView.reloadData()并不总是被调用。有几个代码路径不会调用reloadData。例如,您的
保护
可能失败,或者JSON错误不是零。您是否已仔细阅读了代码以了解其运行方式?您是否可以定义“不工作?”该代码的哪些部分在工作时运行或不运行?tableView似乎没有显示JSON数据。它根本没有显示任何单元格。奇怪的是,它只是偶尔会这样做,大部分时间都在工作。所以它仍然在加载JSON,只是没有显示它?也就是说,
updateDetailShowInfo
仍在被调用且工作正常?是的,尽管出于某种奇怪的原因,self.DetailTvTableView.reloadData()并不总是被调用。有几个代码路径不会调用reloadData。例如,您的
保护
可能失败,或者JSON错误不是零。你有没有仔细阅读过代码,看看它是朝哪个方向发展的?代码示例运行得更好,其中一个没有填充数据的单元格现在运行得更好。虽然当我在self.DetailTVTableView.reloadData()点设置断点时,它显示出除了一个数组之外的所有数组都是空的,即使JSON数据下载正确。知道为什么会发生这种情况吗?那是哪个阵列?您是否将其放在NSJSONSerialization中?在下载下一段json数据之前,在下载json数据之后立即追加数组后,它就可以工作了。奇怪的是,为什么有些我可以批量下载和附加,而有些则不能工作,除非单独下载和附加。虽然当我在self.DetailTVTableView.reloadData()点设置断点时,它显示出除了一个数组之外的所有数组都是空的,即使JSON数据下载正确。知道为什么会发生这种情况吗?那是哪个阵列?您是否将其放在NSJSONSerialization中?在下载下一段json数据之前,在下载json数据之后立即追加数组后,它就可以工作了。奇怪的是,为什么有些我可以批量下载和附加,而有些除非单独下载和附加,否则无法工作。