Эффективный способ разделения данных на основе даты для использования в представлении коллекции - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь разделить изображения из фотобиблиотеки пользователя в представлении коллекции на основе даты их создания в порядке возрастания.Я использую этот метод, который, очевидно, мучительно медленный, особенно когда количество картинок велико.

Сначала я выбираю PHAssets в отсортированном порядке:

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 только тогда, когда они будут отображаться в представлении, однако в представлении коллекции необходимо знать общее количество разделов заранее, поэтому я должен просмотреть все изображения и проверитьих даты перед загрузкой просмотра.

1 Ответ

0 голосов
/ 24 марта 2019

Вы можете извлекать фотоматериалы и выполнять всю логику сортировки в фоновом потоке, как показано в приведенном ниже коде, как только вы закончите интенсивную обработку, вы сможете получить доступ к основному потоку для обновления пользовательского интерфейса.

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