簡體   English   中英

啟動應用程序后,如果每次數組中都出現新內容並且數組相同,則如何重新加載tableview,則無需重新加載

[英]after launching app How to reload tableview if any new content appears in array every time and if array is same then doesn’t need to reload

我的問題:我只想在啟動應用程序后重新加載tableview數據一次,但是每次tableview出現時它都會重新加載 ,如果數組相同,則不需要一次又一次地重新加載

func onHttpSuccess(data: NSDictionary, RID: Int) {
    DispatchQueue.main.async {
        self.progressHUD.hide(animated: true)
    }
    if data.value(forKey: "status") as! Bool {

        if (RID == 1)
        {

            if ((data.value(forKey: "data") as? NSArray)?.count) != nil
            {
                self.userData = (data.value(forKey: "data") as? NSArray)!
                UserDefaults.standard.set(self.userData, forKey: Constants.catDATA)

                print(self.userData)
                if self.userData.count > 0
                {

                    DispatchQueue.main.async
                        {
                            self.tableView.isHidden = false
                            self.tableView.reloadData()
                    }
                }
            }
        }

    }
    else
    {
        Utility.sharedInstance.showAlertView(message: (data.value(forKey: "message") as? String)!, controllerObj: self)
    }

}

一個非常簡單的解決方案是只聲明另一個變量以進行比較,因此起初,您的臨時數組將為空,而實際數組將包含一些元素,因此,您只需比較兩個數組,如果兩者相同,則不需要要執行任何操作,但是如果兩者都不相同,則只需重新加載您的表視圖並更新臨時數組,這樣對於下次進行比較也將有所幫助。 請確保您在重新加載tableview之后更新臨時數組。

希望這會幫助你。

通常,應將表視圖重新加載視為廉價操作,並且如果在重新加載表視圖時遇到一些延遲/無響應,則首先要注意的領域是:

  1. 是否將TableViewCells出隊,而不是在每次需要時創建? 如果沒有,則使緩存的單元出隊。

  2. tableView(cellForRowAt:IndexPath)內部是否發生一些昂貴的操作? 如果是這樣,請考慮使其更快。

  3. 您是否正在主線程上解析HTTP響應? 如果是這樣,您可能是延遲的根源,而不是重新加載表視圖本身,因此可以將其移至后台,就可以了。

如果這些都不是問題,並且由於重新加載表視圖而導致UI性能仍然很差,那么您可以通過將從HTTP響應中檢索到的新數據集與現有表視圖數據進行比較來完成您要解決的問題在決定重新加載之前。 最簡單的方法是將局部變量保留為表視圖控制器的一部分,並在HTTP請求中對此進行檢查:

class MyTableViewController : UITableViewController {

    var tableViewData: NSArray

    func isEqual(_ oldData: NSArray, newData: NSArray) -> Bool {
        // check that all the records in the array are equal
    }

    // call this from inside the onHttpSuccess method in place of self.tableView.reloadData() 
    func reloadIfNeccecary(newData: NSArray) {
        if !isEqual(tableViewData, newData) {
            self.tableView.reloadData()
        }
    }

}

注意:真正應該做的而不是使用NSArrayNSDictionary要做的是使用自定義結構和Decodable協議解析HTTP響應。 然后,您可以將響應對象的數組元素設置為Equatable ,然后將實現isEqual Equatable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM