IOS swift中资源管理的等价物是什么?

时间:2015-05-18 07:49:24

标签: ios

在Android中有一个循环视图,您可以使用资源管理来加载数据,这一切都取决于限制。

例如,我想在IOS中做的是拥有一个表视图单元格,并将其限制为每个滚动只有5个项目。我这样做的原因是不能一次加载所有数据。我想每5次加载数据。

Android到IOS的资源管理等同于什么?

1 个答案:

答案 0 :(得分:2)

像UITableView,UICollectionView和ViewControllers这样的视图(如UIPageViewController和UITabBarController)已针对性能和资源使用进行了优化。通常,他们只会加载创建屏幕内容所需的内容。

每个班级都以不同的方式进行优化。 UITabBarController初始化每个嵌入的ViewController,但在您选择ViewController的选项卡之前,不会加载它们的视图。一旦开始滚动,UIPageViewController就会预加载并缓存下一个或上一个viewController。

UITableView将重用其单元格。 tableView将创建一组初始单元格来填充屏幕。在重复使用单元格之后,如果所有单元格都具有相同的reuseIdentifier并且它们的高度相同,则保留在内存中的最大单元格数是填充屏幕所需的数量+ 1.在单元格重用期间,将单元格放入一旦它移出屏幕就会缓存。当需要下一个单元时,它将从该缓存中获取。

如果您执行一些操作(例如为同一个单元格设置相同的reuseIdentifier),则会自动执行此操作 您必须记住,每个单元格都会多次显示,因此您必须相应地调整代码。例如,您通常不想在tableView:cellForRowAtIndexPath:中向单元格添加视图,因为它可以并且将被多次调用。您应该设计视图以获得最大的可重用性,并创建UITableViewCell子类,您可以在单元格的init中添加这些视图。

探索这一切的最佳方法是创建一堆带有日志记录代码的测试项目。例如,要在UITableView中看到重用:

class Cell: UITableViewCell {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: UITableViewCellStyle.Default, reuseIdentifier: reuseIdentifier)
        println("init Cell")
    }

    required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }

    deinit {
        println("deinit Cell")
    }

    override func prepareForReuse() {
        if let text = textLabel!.text {
            println("prepareForReuse of cell with text \"\(text)\"")
        }
        super.prepareForReuse()
    }
}

class ViewController: UITableViewController {

    override func viewDidLoad() {
        tableView.registerClass(Cell.self, forCellReuseIdentifier: "TestCell")
        tableView.rowHeight = 130 // we don't need 15 cells on screen to demonstrate how that works
    }

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

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

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("TestCell", forIndexPath: indexPath) as! Cell
        cell.textLabel!.text = "Cell \(indexPath.row)"
        println("Display Cell \(indexPath.row)")
        return cell
    }
}

加载后导致此控制台输出:

init Cell
Display Cell 0
init Cell
Display Cell 1
init Cell
Display Cell 2
init Cell
Display Cell 3
init Cell
Display Cell 4
init Cell
Display Cell 5

滚动单元格重复使用后(第一个init是必需的+1单元格,因为索引= 6单元格在index = 0单元格离开屏幕之前可见):

init Cell
Display Cell 6
prepareForReuse of cell with text "Cell 0"
Display Cell 7
prepareForReuse of cell with text "Cell 1"
Display Cell 8