Swift iOS: -Как исключить .livePhotos из включения в PHFetchOptions?

Следуя коду @matt при использовании UIImagePicker я могу запретить пользователю выбирать .livePhoto после выбора изображения с помощью:

let asset = info[UIImagePickerControllerPHAsset] as? PHAsset

if asset?.playbackStyle == .livePhoto { 
   // alert user this photo isn't a possibility 
}

При использовании PHFetchOptions как я могу предотвратить их отображение вместо того, чтобы фильтровать их внутри обратного вызова enumerateObjects?

fileprivate func fetchPhotos() {

    let fetchOptions = PHFetchOptions()
    fetchOptions.fetchLimit = 1000
    let sortDescriptor = NSSortDescriptor(key: "creationDate", ascending: false)
    fetchOptions.sortDescriptors = [sortDescriptor]

    let allPhotos = PHAsset.fetchAssets(with: .video, options: fetchOptions)

    allPhotos.enumerateObjects {
        [weak self] (asset, count, stop) in

        if asset.playbackStyle == .livePhoto {
            return
        }

        let imageManager = PHImageManager.default()
        let targetSize = CGSize(width: 350, height: 350)
        let options = PHImageRequestOptions()
        options.isSynchronous = true

        imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFit, options: options, resultHandler: {
            [weak self] (image, info) in

            if let image = image {
                self?.tableData.append(image)
            }

            if count == allPhotos.count - 1 {
                self?.collectionView.reloadData()
            }
        })
    }
}

person Lance Samaria    schedule 12.09.2018    source источник


Ответы (1)


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

fetchOptions.predicate = NSPredicate(format: "(mediaSubtype & %ld) == 0", PHAssetMediaSubtype.PhotoLive.rawValue)
person rmaddy    schedule 12.09.2018
comment
лол, спасибо, @matt на самом деле ответил мне на этот вопрос в отдельной ветке, и я разместил вопрос, если кто-то еще столкнется с проблемой. Я ждал, что он ответит на него. Да, ваш ответ правильный. Спасибо. Я пока проголосую за него, и если он не ответит, я приму ваш ответ как официальный. Неловкое положение. - person Lance Samaria; 12.09.2018
comment
Вы говорите, что есть еще один вопрос SO, на который уже есть этот ответ? Где? И никогда не публикуйте вопрос, ожидая ответа от конкретного человека. И если вы уже знали ответ, то вы должны были опубликовать свой собственный ответ. - person rmaddy; 12.09.2018
comment
Нет, это была нить, подобная той, в которой мы находимся сейчас. Вопрос был частью разговора. Он отправил ответ в переписку, и я действительно собирался временно опубликовать то, что он предложил, пока он не ответил. Вы правы, хотя, когда вопрос поднят, любой может ответить на него. Спасибо за совет. Посмотрите на последние два комментария в ветке ответов stackoverflow.com/questions/49413685/ - person Lance Samaria; 12.09.2018