【问题标题】:'Unsupported predicate in fetch options: title == "Test"' in osx'获取选项中不支持的谓词:osx中的title ==“Test”'
【发布时间】:2016-09-08 08:04:12
【问题描述】:

我目前正在开发一个应用程序,我需要在其中显示每个相册本地存储在手机上的图像。我已经设法显示所有专辑名称,现在选择相册时我想显示图像。

func getLocalAlbums() {
    var albums: [AlbumModel] = [AlbumModel]()
    albumNamesDevice.removeAll()

    let options = PHFetchOptions()
    let topLvlOptions = PHFetchOptions()
    let userAlbums = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .SmartAlbumUserLibrary, options: options)
    let topLvlCollection = PHCollectionList.fetchTopLevelUserCollectionsWithOptions(topLvlOptions)

    let allAlbums = [topLvlCollection, userAlbums]

    for i in 0 ..< allAlbums.count {
        let result = allAlbums[i]

        result.enumerateObjectsUsingBlock { (asset, index, stop) in
            if asset is PHAssetCollection {
                let ass: PHAssetCollection = asset as! PHAssetCollection
                let fetchOptions = PHFetchOptions()

                fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.Image.rawValue)

                let newAlbum = AlbumModel(name: ass.localizedTitle!, count: ass.estimatedAssetCount, collection: ass)
                albums.append(newAlbum)
            }
        }
    }

    for item in albums {
        self.albumNamesDevice.append(item.name)
    }
}

func getAssetsFromAlbum(albumName: String) -> [PHAsset] {

    let options = PHFetchOptions()
    // Bug from Apple since 9.1, use workaround
    options.predicate = NSPredicate(format: "title = %@", albumName)
    options.sortDescriptors = [ NSSortDescriptor(key: "creationDate", ascending: true) ]

    let results = PHAsset.fetchAssetsWithMediaType(.Image, options: options)
    var assets = [PHAsset]()

    results.enumerateObjectsUsingBlock { (obj, index, stop) in

        if let asset = obj as? PHAsset {
            assets.append(asset)
        }
    }

    return assets
}

问题出在下面一行:

options.predicate = NSPredicate(format: "title = %@", albumName)

我不断收到错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用,原因:“获取选项中不支持的谓词:title == “Test”'

我在 2014 年读到过,这是一个错误,但 Apple 开发人员仍然没有解决这个问题怎么办?

有人知道解决这个问题的方法吗?

【问题讨论】:

    标签: swift photosframework


    【解决方案1】:

    最终我找到了答案,或者至少找到了解决方法

    func getAssetsFromAlbum(albumName: String) -> [PHAsset] {
    
        let options = PHFetchOptions()
        // Bug from Apple since 9.1, use workaround
        //options.predicate = NSPredicate(format: "title = %@", albumName)
        options.sortDescriptors = [ NSSortDescriptor(key: "creationDate", ascending: true) ]
    
        let collection: PHFetchResult = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .Any, options: nil)
    
        for k in 0 ..< collection.count {
            let obj:AnyObject! = collection.objectAtIndex(k)
            if obj.title == albumName {
                if let assCollection = obj as? PHAssetCollection {
                    let results = PHAsset.fetchAssetsInAssetCollection(assCollection, options: options)
                    var assets = [PHAsset]()
    
                    results.enumerateObjectsUsingBlock { (obj, index, stop) in
    
                        if let asset = obj as? PHAsset {
                            assets.append(asset)
                        }
                    }
    
                    return assets
                }
            }
        }
        return [PHAsset]()
    }
    

    【讨论】:

    • 我在 2021 年遇到了和你一样的问题。据我所知,大多数解决方案仍然使用你的解决方法
    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    相关资源
    最近更新 更多