2016-08-07 3 views
1

Я загружаю много путей изображения в NSURL. Изображения находятся в папке, заказываемой от 1.PNG, 2.PNG, 3.PNG до 1500.PNG.
Когда я TRIE, чтобы загрузить их:Заказать массив NSURL

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

В imageURLs массив заполняется с:

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

, а не в числовом порядке!
Может кто-то помочь сортировать изображенияURL или пока я загружаю пути изображения на нем или после их загрузки?

+1

Вам нужно будет использовать функцию 'sort' с пользовательским закрытием, которое указывает, как любая пара данных сравнивается в сортировке. Это закрытие должно было бы проанализировать числа из данных «NSURL» для их сравнения. – Alexander

+0

Просто назовите свои изображения 0001.png, 0002.png, ... он должен работать лучше без сложного программирования – FredericP

ответ

2

Как вы хотите, чтобы отсортировать файлы по номеру, вы должны разобрать первый путь для достижения этой цели, так что давайте предположим, что мы имеем следующий массив NSURL объектов:

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")! ] 

Мы можем использовать pathComponents недвижимость для извлечения массива со всеми компонентами в пути для NSURL (например, ["/", "path", "to", "user", "folder", "2.PNG"]).

Если мы видим, что мы можем заказать файлы по последнему элементу массива, который является именем файла, удаляющим расширение и точку ("."), в этом случае номер. Давайте посмотрим, как сделать это в следующем коде:

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

В приведенном выше коде мы используем функцию sortInPlace, чтобы избежать создания другого массива с элементами отсортированных, но вы можете использовать sort вместо этого, если вы хотите. Другим важным моментом в коде является строка return Int(v1[0]) < Int(v2[0]), в этой строке нам нужно преобразовать число в строке в действительное число, потому что если мы сравним две строки "2" и "100", то вторая будет меньше, чем потому, что строка сравниваются лексикографически.

Таким образом, массив urls должен быть как следующему:

[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:

Две функции pathComponents и componentsSeparatedByString увеличивают пространство сложность алгоритма sortInPlace, если вы можете заявить, что путь к файлам всегда будет таким же, кроме имени файла, который должен быть номером, который вы можете используйте вместо этого код:

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

Я надеюсь, что это поможет вам.

+0

благодарю вас за ответ.Работает нормально, за исключением того, что требуется около одной минуты, чтобы заблокировать приложение за это время. @Victor – Danny182

+0

@ Danny182 Сколько у вас предметов в папке, алгоритм сортировки не должен занимать много времени, вы уверены, что это алгоритм сортировки? –

+0

1500 путей. Да, это так, если я прокомментирую алгоритм сортировки, все в порядке. Я проверяю использование ЦП от Xcode @Victor – Danny182

Смежные вопросы