【问题标题】:Order a NSURL array订购一个 NSURL 数组
【发布时间】:2016-08-09 05:06:03
【问题描述】:

我正在将大量图像路径加载到 NSURL 中。 图片位于从 1.PNG、2.PNG、3.PNG 到 1500.PNG 排序的文件夹中。
当我尝试加载它们时:

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

而不是按数字顺序!
有人可以帮助对 imageURLs 进行排序,或者在我在其上加载图像路径时或加载它们之后?

【问题讨论】:

  • 您必须将sort 函数与自定义闭包一起使用,该闭包指定任何给定元素对在排序中的比较方式。这个闭包需要从给定的NSURLs 中解析出数字来比较它们。
  • 只需将您的图片命名为 0001.png、0002.png, ... 无需复杂编程即可更好地工作

标签: swift sorting nsurl


【解决方案1】:

由于您想按数字对文件进行排序,因此您必须首先解析路径以实现它,因此假设我们有以下 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]) &lt; 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]

编辑:

pathComponentscomponentsSeparatedByString 这两个函数会增加 sortInPlace 算法的空间复杂度,前提是您可以确保文件的路径始终相同,但文件名应该是可以使用的数字而是这段代码:

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

希望对你有所帮助。

【讨论】:

  • 感谢您的回答。工作正常,除了订购需要将近一分钟,在那段时间阻止应用程序。 ?@Victor
  • @Danny182 文件夹里有多少项目,排序算法应该不会花很多时间,你确定是排序算法吗?
  • 1500 条路径。是的,如果我评论排序算法,一切都很好。我正在检查 Xcode @Victor 的 CPU 使用率
  • @Danny182 查看我更新的答案也许可以缩短时间
  • 是的!现在它很完美。 4S有点慢,其他设备不错
猜你喜欢
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多