Swift 2 / Cocoa:大型项目集合的良好实践及其即将发布的UI更新

时间:2016-07-03 00:52:20

标签: swift macos cocoa swift2

我正在做一个共有约800个JSON条目的查找类型的应用程序,我可以将其加载到内存中,因为我只是将明文解析为某些对象以充当简单模型。

但是,我不知道最好的做法是如何处理用户界面的结尾,这是事情放慢速度极大地试图滚动等等:

enter image description here

所以我尝试使用带编号的按钮实现分页,但是在NSCollectionView更新时,UI仍会锁定更新并且页面会在一瞬间发生冲突。

enter image description here

以下是当前导致初始和页面加载发生在ViewController.swift中的代码:

点击按钮导致的操作

@IBAction func changePage(sender: NSButton) {
    let newPage = Int(sender.title)
    currentPageNumber = newPage!
}

public let pageSize = 200;

public var currentPageNumber : Int{
    didSet{
        if(fullMorphemesList.count == 0){
            return;
        }
        loadMorphemesByPage(currentPageNumber)
    }
}

加载项目的逻辑:

///Load morphemes based on page number
func loadMorphemesByPage(pageNumber : Int){
    let beginIndex = (pageNumber - 1) * pageSize
    let endIndex = pageNumber * pageSize

    loadMorphemesIntoDisplay(from: beginIndex, to: endIndex)
}

///Loads morphemes into the collection view
public func loadMorphemesIntoDisplay(from index: Int, to endIndex: Int){
    let morphemesToLoad = fullMorphemesList[index..<endIndex]
    collectionView.content = (Array(morphemesToLoad) as [AnyObject])
}

希望代码有意义,因为我把它们放在近似的触发顺序中。我错过了额外的步骤吗?我是否可以使用异步UI方法来锁定UI的其余部分,并以正确的顺序更新列表而不会出现可视化工件?

非常感谢!

1 个答案:

答案 0 :(得分:1)

使用NSTableView代替可滚动的语素列表,并实现数据源/委托方法(不要忘记表格单元格的reuseIdentifier)。 NSCollectionView还允许支持延迟加载数据源/代理,但在这种情况下已证明更重。通过打开图层并将NSTableRowView的canDrawSubviewsIntoLayer设置为是,您可以获得更多滚动性能改进。

基本上是这样的:

  1. 创建您的NSTableCellView子类和xib(再次不要忘记重用标识符)。

  2. 使用基于视图的NSTableView注册你的xib并使用里面的reuseIdentifier

  3. func tableView(tableView: NSTableView, viewForTableColumn: NSTableColumn, row: Int) -> NSView