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