使用 PHFetchOptions.predicate 从 PHAssetCollection 获取 PHAsset 的问题

Posted

技术标签:

【中文标题】使用 PHFetchOptions.predicate 从 PHAssetCollection 获取 PHAsset 的问题【英文标题】:issue fetching PHAssets from PHAssetCollection using PHFetchOptions.predicate 【发布时间】:2015-09-08 20:44:12 【问题描述】:

我试图仅从 PHAssetCollection 获取图像,但我没有看到谓词影响结果。 我正在将 PHFetchOptions 设置为 mediaType == Image 但是当我从库中选择一个视频时,它会传递谓词并且 println 也会确认该类型。

不知道为什么会这样,我可能在这里遗漏了什么问题?

        let fetchOptions = PHFetchOptions()

        fetchOptions.predicate = NSPredicate(format: "mediaType == %d", argumentArray: [PHAssetMediaType.Image.rawValue])
        println(fetchOptions) // mediaType == 1

        let assetsFetch = PHAsset.fetchAssetsInAssetCollection(assetCollection, options: fetchOptions)

        assetsFetch.enumerateObjectsUsingBlock  (obj:AnyObject!, idx:Int, stop:UnsafeMutablePointer<ObjCBool>) -> Void in
            if let asset = obj as? PHAsset
                println(asset) 
                //prints: <PHAsset: 0x1703a1f80> A45796D5-528F-4D5E-A8D8-5F3F47CF40A1/L0/001 mediaType=2/0, assetSource=3, (1920x1080), creationDate=2014-11-11 16:34:12 +0000, location=1, hidden=0, favorite=0 

            
        

【问题讨论】:

【参考方案1】:

您的抓取和选项看起来不错。 PHAssetCollection 是用transientAssetCollectionWithAssets:title:transientAssetCollectionWithAssetFetchResult:title 创建的吗?

如果是这样,那么这些选项基本上会被忽略。

【讨论】:

【参考方案2】:

这是一个可以完成这项工作的选项:

func convertFetchResultToPhotosArray(assetsFetch: PHFetchResult<PHAsset>) -> [PHAsset] 
    var photos = [PHAsset]()

    for i in 0 ..< assetsFetch.count 
        let asset = assetsFetch[i]
        if asset.mediaType == .image  photos.append(asset) 
    

    return photos

...然后将您的 assetsFetch 传递给此函数

【讨论】:

以上是关于使用 PHFetchOptions.predicate 从 PHAssetCollection 获取 PHAsset 的问题的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)