Как установить смещение в PHAsset.fetchAssets?
Это мой код для загрузки изображений из галереи устройства.
let imgManager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
//loading all the images
requestOptions.isSynchronous = false
//Quality of the image
requestOptions.deliveryMode = .highQualityFormat
//requestOptions.resizeMode = .fast
//Sorted images
let fetchOptions = PHFetchOptions()
fetchOptions.fetchLimit = 500
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let fetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions)
DispatchQueue.global(qos: .background).async {
if fetchResult.count > 0 {
DispatchQueue.main.async {
self.showProgress()
}
for i in 0..<fetchResult.count{
imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: self.selectedImage.frame.width, height:self.selectedImage.frame.height), contentMode: .aspectFill, options: requestOptions, resultHandler: {
image, error in
if(image == nil){
}else{
self.imageArray.append(image!)
}
})
}
DispatchQueue.main.async {
self.hideProgress()
self.photosCollectionView.reloadData()
}
}else{
self.hideProgress()
self.showDefaultAlert(title: "Alert", message: "Could not fetch images from the gallery")
}
У меня возникают проблемы с памятью, когда в устройстве более 1500 изображений. Я выяснил, как установить предел, как получить следующие 500 изображений, когда представление коллекции прокручивается вниз? Любая помощь приветствуется.
1 ответ
Какую проблему вы исправляете? Я думаю, тяжелая операция находится в requestImage, вы можете попробовать
fetchResult.objects(at: IndexSet(0...500))
fetchResult.objects(at: IndexSet(501...1000))
и т. д. или может быть добавить предикат
fetchOptions.predicate = NSPredicate(format: "@NOT(localIdentifier IN %@)", alreadyGettedIdentifiers)
for i in 0..<fetchResult.count{
let fetchResult = fetchResult.object(at: i)
alreadyGettedIdentifiers.append(fetchResult.localIdentifier)
PHImageManager.default().requestImage(for: fetchResult, targetSize: CGSize(width: 200, height:200), contentMode: .aspectFill, options: requestOptions, resultHandler: {
image, error in
if(image == nil){
}else{
self.imageArray.append(image!)
}
})
}