2016-08-07 24 views
1

Ich lade viele Bildpfade in eine NSURL. Die Bilder sind in einem Ordner von 1.PNG, 2.PNG, 3.PNG bis 1500.PNG bestellt.
Wenn ich Trie sie laden:Bestellen eines NSURL-Arrays

let imagePath = path + "/images" 
     let url = NSURL(fileURLWithPath: imagePath) 
     print(url) 
     let fileManager = NSFileManager.defaultManager() 
     let properties = [NSURLLocalizedLabelKey, 
          NSURLCreationDateKey, NSURLLocalizedTypeDescriptionKey] 

     do { 
      imageURLs = try fileManager.contentsOfDirectoryAtURL(url, includingPropertiesForKeys: properties, options:NSDirectoryEnumerationOptions.SkipsHiddenFiles) 
     } catch let error1 as NSError { 
      print(error1.description) 
     } 

Die imageURLs Array wird gefüllt mit:

imageURLs [0] = ... \ 0.png
imageURLs [1] = ... \ 1.PNG
imageURLs [2] = ... \ 100.PNG
imageURLs [3] = ... \ 1000.PNG

und nicht in der numerischen Reihenfolge!
Kann mir jemand helfen, die imageURLs zu sortieren oder während ich die Bildpfade darauf lade oder nachdem sie geladen wurden?

+1

Sie müssen die 'sort' -Funktion mit einer benutzerdefinierten Schließung verwenden, die angibt, wie ein beliebiges Paar von Elementen in der Sortierung verglichen wird. Diese Schließung müsste die Zahlen von den gegebenen 'NSURLs analysieren, um sie zu vergleichen. – Alexander

+0

Nennen Sie einfach Ihre Bilder 0001.png, 0002.png, ... sollte es ohne komplexe Programmierung besser funktionieren – FredericP

Antwort

2

Wie Sie die Dateien durch die Anzahl sortieren möchten Sie zuerst den Pfad zu analysieren haben, es zu erreichen, so nehmen wir an, wir die folgende Reihe von NSURL Objekte haben:

var urls = [NSURL(string: "file:///path/to/user/folder/2.PNG")!, NSURL(string: "file:///path/to/user/folder/100.PNG")!, NSURL(string: "file:///path/to/user/folder/101.PNG")!, NSURL(string: "file:///path/to/user/folder/1.PNG")! ] 

Wir können die pathComponents Eigenschaft verwenden um ein Array mit allen Komponenten im Pfad für eine NSURL (zB ["/", "path", "to", "user", "folder", "2.PNG"]) zu extrahieren.

Wenn wir sehen, können wir die Dateien durch das letzte Element im Array bestellen, das ist der Dateiname, der die Erweiterung und den Punkt entfernt ("."), in diesem Fall die Nummer. Mal sehen, wie es in dem folgenden Code zu tun:

urls.sortInPlace { 

    // number of elements in each array 
    let c1 = $0.pathComponents!.count - 1 
    let c2 = $1.pathComponents!.count - 1 

    // the filename of each file 
    var v1 = $0.pathComponents![c1].componentsSeparatedByString(".") 
    var v2 = $1.pathComponents![c2].componentsSeparatedByString(".") 

    return Int(v1[0]) < Int(v2[0]) 
} 

In dem obigen Code wird die Funktion verwenden sortInPlace, um ein anderes Array zu vermeiden erstellen mit den sortierten Elemente, aber Sie sort stattdessen verwenden können, wenn Sie wollen. Der andere wichtige Punkt im Code ist die Zeile return Int(v1[0]) < Int(v2[0]), in dieser Zeile müssen wir die Zahl in der Zeichenkette in eine reelle Zahl umwandeln, denn wenn wir die beiden Zeichenketten "2" und "100" vergleichen, ist die zweite weniger als größer als die Zeichenkette werden lexikographisch verglichen.

[file:///path/to/user/folder/1.PNG, file:///path/to/user/folder/2.PNG, file:///path/to/user/folder/100.PNG, file:///path/to/user/folder/101.PNG] 

EDIT:

So das das Array urls wie die folgende sein sollte

Die beiden Funktionen pathComponents und componentsSeparatedByString erhöhen den Raum Komplexität des sortInPlace Algorithmus, Wenn Sie sicher sein können, dass der Pfad für die Dateien immer gleich ist, außer dass der Dateiname eine Nummer ist, die Sie verwenden können Verwenden Sie stattdessen diesen Code:

urls.sortInPlace { $0.absoluteString.compare(
        $1.absoluteString, options: .NumericSearch) == .OrderedAscending 
} 

Ich hoffe, das hilft Ihnen.

+0

danke für die Antwort.Funktioniert gut, außer dass es fast eine Minute dauert zu bestellen, die App für diese Zeit blockiert. @Victor – Danny182

+0

@ Danny182 Wie viel Elemente haben Sie in dem Ordner, sollte der Sortieralgorithmus nicht viel Zeit dauern, sind Sie sicher, dass es der Sortieralgorithmus ist? –

+0

1500 Pfade. Ja, wenn ich den Sortieralgorithmus kommentiere, ist alles in Ordnung. Ich überprüfe die CPU-Nutzung von Xcode @Victor – Danny182