tableview中的慢/断续滚动

时间:2016-03-21 23:53:14

标签: ios arrays swift uitableview

我从字典数组(tasks)中加载了大约150个元素,我可以将所有数据放入我的tableview中,但是当我滚动它的愚蠢慢时。当我将其中一个函数的信息打印到控制台时,看起来每次滚动时我都会收到所有数据。这是我加载不好(即异步)还是我需要更改我的功能?

    func querySections() -> [String] {
        var sectionsArray = [String]()
        for task in tasks {
            let dueTimes = task.dueTime
            sectionsArray.append(dueTimes)
        }
        let uniqueSectionsArray = Array(Set(sectionsArray.sort()))
//        print(uniqueSectionsArray)
        return uniqueSectionsArray
    }


    func queryDueTimes(section:Int) -> [Task] {
        var sectionItems = [Task]()
        for task in tasks {
            let dueTimes = task.dueTime
            if dueTimes == querySections()[section] {
                sectionItems.append(task)
            }
        }
        print(sectionItems)
        return sectionItems
    }



    // MARK: - Table view data source

    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return querySections()[section]
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return querySections().count
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return queryDueTimes(section).count
    }


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("TaskCell", forIndexPath: indexPath) as! TaskCell

        // Configure the cell...
        cell.selectionStyle = .None
        let times = queryDueTimes(indexPath.section)
        let task = times[indexPath.row]
        cell.label.text = task.title
        if task.done == true {
            cell.checkBox.image = UIImage(named: "checkedbox")
            cell.detailLabel.text = "Completed By: \(task.completedBy)"
            }
            else {
            cell.checkBox.image = UIImage(named: "uncheckedbox")
            cell.detailLabel.text = ""
            }

        cell.delegate = self
        return cell
    }

基本上,在querySections中,我遍历每个任务的所有dueTimes然后将它们更改为一个集合的数组,以便我可以过滤掉所有重复项。这给了我所有的部分。对于queryDueTimes,我会迭代完成任务并将它们匹配到一个部分。

我考虑过调用viewDidLoad中的函数但是没有工作(当我尝试将它传递给另一个在函数外部更容易访问的空数组时,它一直给我一个空数组)我无法访问viewDidLoad中的部分(queryDueTimes)(据我知道该怎么做)。

更新1: 我认为错误就在我身上。我说我的任务是一个数组数组,当它只是一个Task数组(一个包含每个任务的所有属性的结构)。当我加载应用程序时,我将后端的所有任务附加到本地数组(" tasks")。我是否应该有一个数组来运行,或者我可以以某种方式修改我的代码并使其工作?

更新2:

我打印时,我将sectionTimestasksInSectionArray作为空数组。

    var sectionTimes = [String]()
    var tasksInSectionArray = [[Task]]()
    var tasks = [Task]() {
        didSet {
            tableView?.reloadData()
        }
    }

    func updateTableView() {
            sectionTimes = Set(tasks.map{$0.dueTime}).sort()
            tasksInSectionArray = sectionTimes.map{section in tasks.filter{$0.dueTime == section}}
            print(sectionTimes)
            print(tasksInSectionArray)
            tableView.reloadData()
        }

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
            return sectionTimes[section]
        }

        override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            return sectionTimes.count
        }

        override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return tasksInSectionArray[section].count
        }


        override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("TaskCell", forIndexPath: indexPath) as! TaskCell

            // Configure the cell...
            cell.selectionStyle = .None
            let task = tasksInSectionArray[indexPath.section][indexPath.row]

2 个答案:

答案 0 :(得分:3)

就像你猜测的那样,数据被反复加载和排序,而不是一次。保存querySelectionsqueryDueTimes的结果,并在表格视图数据源方法中使用它。

您可以在viewDidLoad中执行此操作 - 调用两个函数并将结果分配给类级别的变量,然后调用tableView.reloadData()(假设您有对表视图的引用)。

答案 1 :(得分:1)

var sections: [String] = []
var data: [[Tasks]] = []

func updateTableView() {
    sections = Set(tasks.map { $0.dueTime }).sort()
    data = sections.map { section in tasks.filter { $0.dueTime == section } }
    tableView.reloadData()
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return sections.count
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return data[section].count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let task = data[indexPath.section][indexPath.row]

    // Cell configuration
}

这基本上就是DMan所说的,但我已经为你做了一个例子。