2017-03-05 56 views
1

當我滾動到UITableView的底部時,應用程序應該調用一個函數(「CallAlamo(url:nextSearchURL)」),它只是將新內容附加到數組,然後調用tableView.reloadData(),然後用更多的內容更新tableview。但是,在此過程中,tableView完全凍結約2-3秒。我怎樣才能讓它不像其他應用中的大多數表視圖那樣被凍結和工作,其中新內容被加載並且用戶可以自由移動tableview。當滾動到底部並添加新行時,UITableView凍結

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    let lastElement = posts.count - 1 
    if indexPath.row == lastElement { 

     callAlamo(url: nextSearchURL) //appends new content to array 
     tableView.reloadData() 

    } 
} 

UPDATE

這是callAlamo做什麼:

func callAlamo(url : String){ 
    Alamofire.request(url).responseJSON(completionHandler: { 
    response in 

     self.parseData(JSONData: response.data!) 

    }) 
} 

func parseData(JSONData : Data){ 

    do{ 
     var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard 
     //print(readableJSON) 
     if let tracks = readableJSON["tracks"] as? JSONStandard{ 
      nextSearchURL = tracks["next"] as! String 
      if let items = tracks["items"] as? [JSONStandard]{ 
       //print(items) //Prints the JSON information from Spotify 
       for i in 0..<items.count{ 
        let item = items[i] 
        let name = item["name"] as! String 
        let previewURL = item["preview_url"] as! String 
        if let album = item["album"] as? JSONStandard{ 
         if let images = album["images"] as? [JSONStandard],let artist = album["artists"] as? [JSONStandard]{ 
          let imageData = images[0] //this changes the quality of the album image (0,1,2) 
          let mainImageURL = URL(string: imageData["url"] as! String) 
          let mainImageData = NSData(contentsOf: mainImageURL!) 

          let mainImage = UIImage(data: mainImageData as! Data) 

          let artistNames = artist[0] 
          let artistName = artistNames["name"] as! String 

          posts.append(post.init(mainImage: mainImage, name: name, artistName: artistName, previewURL: previewURL)) 
          self.tableView.reloadData() 
         } 
        } 
       } 
      } 
     } 
    } catch{ 
     print(error) 
    } 
} 

更新2

使用@ Anbu.Karthik選擇2:

問題1 :是「imageData」將成爲我的「mainImagedata」?

問題2:我在Alamofire.request中發現錯誤...在調用中說「額外參數」方法「,當我刪除它時,出現錯誤,提示」NSData?沒有下標成員「

+0

不需要這種'tableView.reloadData()'可以顯示callAlamo的'代碼(u' –

+0

@ Anbu.Karthik沒關係只是更新了它,我知道我也在callAlamo中調用tableView.reloadData(),但是我在tableView func中取出了tableView.reloadData()仍然凍結 – OriginalAlchemist

+1

你肯定需要,因爲你正在使用'let mainImageURL = URL(string:imageData [「url」] as!字符串) let mainImageData = NSData(contentsOf:mainImageURL!)',它會影響主線程, –

回答

2

非常糟糕的代碼設計,您應該將url傳遞給單元格並讓它執行讀取和解析,並且您正在主隊列中執行此操作。你可以使用(使用另一個隊列)DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async。 IDK如果Alamofire在主隊列上調用了你的閉包,但它看起來好像它對它做了請求。當你想要使用UI時,不要忘記返回主隊列DispatchQueue.main.async

更新:我希望很清楚reloadData(),有點讓你無限循環,你應該在外面調用它們在TableViewDataSource funcitons

更新2:我沒有看到它在這裏,但你應該使用tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath),並在其中使用let cell = tableView.dequeueReusableCell.....

+0

我明白了,我明白了。感謝您的答覆!我有點困惑你的意思,通過傳遞網址到單元格和「讓它獲取和解析」。你介意給出一些示例代碼來說明如何去做你說的話嗎? – OriginalAlchemist

+0

您需要爲單元格創建一個類 –

+0

以下是示例(當然在單元格的類中):https://imgur.com/a/dJcR7#sjUKOQ7 –

相關問題