0

我正在尝试根据用户的创建日期按升序在集合视图中对用户的照片库图片进行分区。我正在使用这种方法,这显然非常缓慢,尤其是当图片数量很多时。

首先,我按排序顺序获取 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 中,但是,集合视图需要预先知道部分的总数,因此我必须浏览所有图片并检查他们在加载视图之前的日期。

4

1 回答 1

0

您可以像下面的代码一样在后台线程中获取照片资源并执行所有排序逻辑,一旦完成繁重的处理,您就可以访问主线程来更新 UI。

let allPhotosOptions = PHFetchOptions()
allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]


DispatchQueue.global(qos: .userInitiated).async {
    let photos = PHAsset.fetchAssets(with: .image, options: nil)
    var result = [Any]()

    photos.enumerateObjects({ asset, _, _ in
        // do the fetched photos logic in background thread


    })

    DispatchQueue.main.async {
    //   once you will get all the data, you can do UI related stuff here like
    //   reloading data, assigning data to UI elements etc.
    }
}
于 2019-03-24T13:11:59.443 回答