2016-07-03 16 views
2

Ich mache eine Lookup-App mit etwa 800 JSON-Einträge insgesamt, die ich in den Speicher laden kann gut, weil ich nur Parsing bin Klartext in einige Objekte, um als einfache Modelle zu fungieren.Swift 2/Cocoa: Gute Praxis für große Artikel-Sammlungen und ihre bevorstehenden UI-Updates

aber ich weiß nicht, was die beste Praxis mit dem UI-Ende, das zu behandeln ist, das ist, wo die Dinge verlangsamen immens zu bewegen versucht, etc:

enter image description here

So habe ich versucht, Implementieren der Seitennummerierung mit den nummerierten Schaltflächen, die funktionieren, aber die Benutzeroberfläche blockiert weiterhin die Aktualisierung und die Seiten kollidieren für einen Bruchteil einer Sekunde, während die aktualisiert wird.

enter image description here

Hier ist der Code, der die ersten und Seite geladen wird geschehen in ViewController.swift zur Zeit verursacht:

Die Aktion, die Klicken auf die Buttons

@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) 
    } 
} 

Die Logik, wo die Einzelteile sind verursachen geladen werden in:

///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]) 
} 

Hoffentlich macht der Code Sinn, da ich sie in ungefähre Zündfolge gebracht habe. Gibt es zusätzliche Schritte, die ich verpasse? Gibt es asynchrone UI-Methoden, die ich verwenden könnte, um den Rest der Benutzeroberfläche nicht zu sperren und die Liste in der richtigen Reihenfolge ohne visuelle Artefakte zu aktualisieren?

Vielen Dank!

+1

Es ist schwer zu sagen, was Langsamkeit verursachen kann, kann es Tonnen von Gründen. 200 Objekte sollten jedoch nicht so langsam zur Sammlungsansicht gebracht werden. Um den Grund für Artefakte zu finden, würde ich mit CA Layern anderer Ansicht spielen. Beginnen Sie damit, alles mit CA-Layern abzusichern (in der Utilities-Ansicht von XCode - dem letzten Element mit eingebetteten Quadratsymbolen, überprüfen Sie Core-Animationsebene für die übergeordneten und untergeordneten Sammlungsansichten). Sehen Sie, ob es einen Unterschied macht. –

Antwort

1

Verwenden Sie stattdessen eine NSTableView für die scrollbare Liste der Morpheme und implementieren Sie die Datenquellen-/Delegate-Methoden (Vergessen Sie nicht den reuseIdentifier für die Tabellenzelle). NSCollectionView unterstützt auch das verzögerte Laden mit Datenquellen/Delegaten, hat sich jedoch in solchen Fällen als schwerer erwiesen. Sie können noch mehr Scrolling-Performance-Verbesserungen erzielen, indem Sie Layer aktivieren und den CanDrawSubviewsIntoLayer Ihrer NSTableRowView als yes setzen.

Also im Grunde:

  1. Erstellen Sie Ihre NSTableCellView Unterklasse und xib (wieder nicht zu vergessen die Wiederverwendung identifier).

  2. Registrieren xib mit ansichtsbasierte NSTableView und verwenden Sie die reuseIdentifier innerhalb

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