Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 2/Cocoa:大型项目集合及其即将进行的UI更新的良好实践_Swift_Macos_Cocoa_Swift2 - Fatal编程技术网

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

Swift 2/Cocoa:大型项目集合及其即将进行的UI更新的良好实践,swift,macos,cocoa,swift2,Swift,Macos,Cocoa,Swift2,我正在做一个查找类型的应用程序,总共有大约800个JSON条目,我能够很好地加载到内存中,因为我只是将明文解析成一些对象,作为简单的模型 但是,我不知道处理UI端的最佳实践是什么,在UI端,尝试滚动时速度会大大减慢,等等: 因此,我尝试使用编号的按钮实现分页,这很有效,但UI仍然会锁定更新,并且当NSCollectionView更新时,页面会在瞬间发生冲突 以下是当前导致初始和页面加载在ViewController.swift中发生的代码: 单击按钮导致的操作 @IBAction func

我正在做一个查找类型的应用程序,总共有大约800个JSON条目,我能够很好地加载到内存中,因为我只是将明文解析成一些对象,作为简单的模型

但是,我不知道处理UI端的最佳实践是什么,在UI端,尝试滚动时速度会大大减慢,等等:

因此,我尝试使用编号的按钮实现分页,这很有效,但UI仍然会锁定更新,并且当
NSCollectionView
更新时,页面会在瞬间发生冲突

以下是当前导致初始和页面加载在
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])
}
///根据页码加载语素
func loadMorphemesByPage(页码:Int){
让beginIndex=(页码-1)*pageSize
让endIndex=pageNumber*pageSize
加载语素到显示(从:beginIndex到:endIndex)
}
///将语素加载到集合视图中
public func loadMorphemesIntoDisplay(从索引:Int到endIndex:Int){

让morphemesToLoad=fullMorphemesList[index..为可滚动的语素列表使用NSTableView,并实现数据源/委托方法(不要忘记表格单元格的reuseIdentifier).NSCollectionView还允许使用数据源/委托进行延迟加载,但在这种情况下已被证明会更重。通过打开图层并将NSTableRowView的CandrawSubViewsToLayer设置为yes,您可以获得更高的滚动性能改进

所以基本上:

  • 创建NSTableCellView子类和xib(同样不要忘记重用标识符)

  • 在基于视图的NSTableView中注册xib,并在其中使用reuseIdentifier


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

    很难说什么会导致速度慢,可能有很多原因。但是将200个对象放到集合视图不应该那么慢。要找到工件的原因,我将开始使用不同视图的CA层。首先使用CA层备份所有内容(在XCode的实用程序视图中,最后一个带有嵌入方块图标的项目,检查集合视图父视图和子视图的核心动画层)。查看是否有任何区别。