2017-08-01 13 views
2

JSONを使用してデータを取得しましたが、画面をスクロールするとサーバーに要求があり、データが終了してアプリケーションがクラッシュすることがありました。TableViewのinsertRows

ここに私のコード:

override func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if (!isMoreDataLoading) { 

     let down = "https://--.com/local/apps/apple/events.php/?nPageSize=\(nPageSize)&iNumPage=\(iNumPage)" 
     let scrollViewContentHeight = tableView.contentSize.height 
     let scrollOffsetThreshold = scrollViewContentHeight - tableView.bounds.size.height 
     if(scrollView.contentOffset.y > scrollOffsetThreshold && tableView.isDragging) { 
      isMoreDataLoading = true 
      requestD(url: down) 
     } 
    } 
} 
func requestD(url:String){ 

    var urlRequest = URLRequest(url: URL(string: url)!) 
    urlRequest.timeoutInterval = 300 
    let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in 

     if error != nil{ 
      print(error ?? 0) 
      return 
     } 
     do{ 
      let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String : AnyObject] 
      if let newsJson = json["EVENTS"] as? [[String : AnyObject]] { 

       for newJson in newsJson{ 
        let info = Modal() 

        info.id = newJson["ID"] as? String 
        info.name = newJson["NAME"] as? String 

        if newJson["PICTURE"] as? String != nil { 
         info.ImageViewURL = newJson["PICTURE"] as! String 
        } 
        if newJson["PICTURE_DETAIL"] as? String != nil { 
         info.ImageViewURLDetail = newJson["PICTURE_DETAIL"] as! String 
        } 
        info.stmp = newJson["STMP"] as? Int 
        info.text = newJson["DETAIL_TEXT"] as? String 


        info.name = info.name?.replacingOccurrences(of: "&[^;]+;", with: "", options: String.CompareOptions.regularExpression, range: nil) 
        info.text = info.text?.replacingOccurrences(of: "&[^;]+;", with: "", options: String.CompareOptions.regularExpression, range: nil) 


        if self.isRefresh == true { 
         self.modals.insert(info, at: 0) 
        } else { 
         self.modals.append(info) 
        } 



       } 
      } 

     } catch let error { 
      print(error) 
     } 

     DispatchQueue.main.sync { 

      self.iNumPage += 1 
      self.isMoreDataLoading = false 


      self.Preload.preloadEnd(tableView: self.tableView) 

      // self.tableView.reloadData() 


      self.tableView.beginUpdates() 
      self.tableView.insertRows(at: [IndexPath(row: self.modals.count - 1, section: 0)], with: .automatic) 
      self.tableView.endUpdates() 

     } 
    } 

    task.resume() 
} 

は理由:'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

+0

クラッシュメッセージとは何ですか? – Paulw11

+0

@ Paulw11の理由 – Vasya2014

答えて

0

あなたは次のことを行う必要があるだろうのtableViewの要素を挿入/削除する場合:

  1. データを追加します。 tableViewのバッキングデータソースに格納します。
  2. tableViewを再ロードします。

(このコードはdidSelectRowAtIndexPathに入れた)点を示すためにいくつかのコード:

anArray.insert("This String", atIndex: indexPath.row) 
tableView.reloadData() 
2

あなたがアレイ内に新たなデータを追加されていない新しいテーブル行を設定しています。 テーブルに新しい行を挿入する前に、このコードself.modals.insert("<#DATA#>, atIndex: yourIndex)を追加してください。 DispatchQueueを削除してみてください

+0

あなたは私の質問を理解していません。ユーザーがスクロールダウンしたときにデータがない場合はロックする必要があります – Vasya2014

+1

新しい行を追加する場所をブロックするブロックを更新します –

+0

データタスクが時間がかかり、テーブルを挿入する際に両方のコードが同期していないと、コードが来るのを待っていない –