我正在尝试根据用户的创建日期按升序在集合视图中对用户的照片库图片进行分区。我正在使用这种方法,这显然非常缓慢,尤其是当图片数量很多时。
首先,我按排序顺序获取 PHAsset:
let allPhotosOptions = PHFetchOptions()
allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
inFetchResult = PHAsset.fetchAssets(with: allPhotosOptions)
然后我将资产复制到一个数组中:
inFetchResult.enumerateObjects { (asset, index, stop) in
let yearComponent = Calendar.current.component(.year, from: asset.creationDate!)
let monthComponent = Calendar.current.component(.month, from: asset.creationDate!)
let monthName = DateFormatter().monthSymbols[monthComponent - 1]
var itemFound = false
for (index, _) in self.dateArray.enumerated() {
if self.dateArray[index].date == "\(monthName) \(yearComponent)" {
self.dateArray[index].assets.append(asset)
itemFound = true
break
} else {
continue
}
}
if !itemFound {
self.dateArray.append((date: "\(monthName) \(yearComponent)", assets: [asset]))
}
}
然后我使用这个数组作为我的数据源。
有一个更好的方法吗?我试过字典,但它们改变了对象的顺序。我还考虑过找到一种方法,仅在资产将要显示在视图上时才将它们添加到我的 dateArray 中,但是,集合视图需要预先知道部分的总数,因此我必须浏览所有图片并检查他们在加载视图之前的日期。