2016-04-09 7 views
1

Ich verwende UISearchController für die Suche in einem Array von 86.111 Objekte (eigentlich suche ich in der name Eigenschaft jedes Objekts).UISearchController macht UI freeze

Aus irgendeinem Grund, wenn ich auf der Suchleiste zu tippen beginnen, friert die Benutzeroberfläche für ein paar Sekunden ein und beginnt dann wieder zu arbeiten (z. B. friert die Tastatur auf einem Brief usw.).

Ich denke, es ist, weil meine Benutzeroberfläche wirklich groß ist - ich kann verstehen, warum es sehr langsam sucht, aber ich kann nicht verstehen, warum es die Benutzeroberfläche einfriert (ist es nicht auf einem Hintergrundthread?).

mir wirklich glücklich sein, wenn jemand in der Lage sein wird, mir, viele

Ihnen zu helfen!

Antwort

1

Wahrscheinlich passiert Ihre eigentliche Suche (durch alle Ihre Objekte) auf dem Hauptthread. UISearchController hat nichts mit Threads zu tun, es lässt den Programmierer diesen Teil implementieren, deshalb verwenden Sie den Hauptthread für die Suche. Ich weiß nicht, wie Sie das alles implementiert haben, aber Sie sollten dispatch_async oder NSOperationQueue verwenden, um die Suche nach einem Hintergrundthread durchzuführen.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    //Code to perform the search 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     //Set the results of the search in the UI 
    }); 
}); 

Siehe this Antwort zum Umschalten zwischen Threads.

+0

Ich habe versucht, 'NSOperationQueue' auf meinem 'searchResults' Array-Setter zu verwenden, aber wie kann ich das Array auf einem Hintergrund-Thread' zurückgeben '? –

+0

Wenn Sie 'NSOperationQueue' verwenden, können Sie Code mit' [NSOperationQueue mainQueue] 'im Hauptverzeichnis ausführen. Ich aktualisierte auch meine Antwort mit einigen grundlegenden Beispiel mit 'dispatch_async' – Jelly

+0

Ja, ich weiß, aber wenn' searchResults' Getter aufgerufen wird (wo ich das Array mit 'NSPredicate' filtern) muss ich das Array zurückgeben, aber wenn es ist Wie kann ich in einem Hintergrundthread das korrekte und aktualisierte Array zurückgeben? –

0

Ich denke, Sie können Ihre Suche im Hintergrund Thread mit GCD (Grand Central Dispatch) durchführen. Anschließend können Sie Ihren Codeteil, der die Benutzeroberfläche aktualisiert, in den Block dispatch_async verschieben, da die Aktualisierung der Benutzeroberfläche im Hauptthread erfolgen sollte.

Wenn Sie die Dispatcher-Warteschlange in swift verwenden, können Sie Code wie diesen schreiben.

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

dispatch_async(queue) {() -> Void in 

    let resultArray = Search() 

    dispatch_async(dispatch_get_main_queue(), { 
     UI_Update() 
    }) 
} 

Wenn Sie NSOperation-Warteschlange verwenden, denke ich, dass dieser Code funktioniert.

+0

Ich habe versucht, 'NSOperationQueue' in meinem 'searchResults'-Array-Setter zu verwenden, aber wie kann ich das Array in einem Hintergrund-Thread' zurückgeben '? –

+0

* Getter - mein schlechtes –