如何按使用 fetchAssets 添加的日期顺序获取 PHAsset

Posted

技术标签:

【中文标题】如何按使用 fetchAssets 添加的日期顺序获取 PHAsset【英文标题】:How to get PHAssets in the order of date added using fetchAssests 【发布时间】:2018-09-13 13:08:51 【问题描述】:

我正在尝试按照用户添加它们的顺序从相机胶卷、iCloud 和 Photostream 中获取 PHAsset。在 ios 11 中,我使用

PHFetchOptions *options = [[PHFetchOptions alloc] init];
PHFetchResult *fetchResults = [PHAsset fetchAssetsWithOptions:options];

但这在 iOS 12 中已停止工作。使用此 iCloud 图像和相机胶卷图像是分开的。只有 2 个排序描述符提供了 creationDate 和 modifiedDate。

我尝试的第二种解决方案是使用智能相册从“用户库”中获取照片。 “用户库”的工作方式会根据用户是否打开 iCloud 库而有所不同。如果 iCloud 库已打开,则用户库包含相机胶卷和 iCloud 库中的所有图像。如果 iCloud 库已关闭,则用户库仅包含相机胶卷中的图像。这会以正确的顺序从相机胶卷和 iCloud 库中返回图像。问题是它无法从 Photostream 中获取图像。

在另一种解决方案中,如果 iCloud 库已打开,则从用户库中获取照片,如果 iCloud 已关闭,则使用旧方法获取照片,从而为我们提供照片流和相机胶卷图像的正确顺序。

此解决方案也不起作用。

请检查以下场景:

iCloud 库已关闭,而 Photostream 已打开。我们将使用带有默认选项的 fetchAssetsWithOption。顺序是正确的。 用户打开 iCloud。 Photostream 会自动关闭。我们将从“用户库”中获取照片。为我们提供来自 iCloud 的所有图像以及按默认选项排序的相机胶卷。顺序是正确的。 现在用户关闭了 iCloud 库。 iCloud 中的所有图像都应该从设备中删除。但是,来自 iCloud 的一些图像会留在相机胶卷中。它们没有被删除(可能是由于 iCloud 中的错误)。结果,这些未删除的图像总是出现在顶部。如果用户从 iCloud 下载图像并且在 iCloud 关闭时没有删除图像,也会发生这种情况。

那么有什么办法吗。

【问题讨论】:

【参考方案1】:

答案正在针对 iOS 13 进行更新,其中使用“smartAlbumRecentlyAdded”比“smartAlbumUserLibrary”效果更好,因为行为发生了变化:向 Apple 发送了关于 iOS 13 中行为变化的反馈。希望手头有更好的解决方案.

因为,虽然 smartAlbumRecentlyAdded 会按添加日期返回项目,但您不会得到所有项目,只会得到最近的项目。

    var fetchResult:PHFetchResult<PHAssetCollection>

    if #available(iOS 13.0, *) 
        fetchResult = PHAssetCollection.fetchAssetCollections(with:.smartAlbum,subtype:.smartAlbumRecentlyAdded,options: nil)
    
    else 
        fetchResult = PHAssetCollection.fetchAssetCollections(with:.smartAlbum,subtype:.smartAlbumUserLibrary,options: nil)
    

    if let assetCollection = fetchResult.firstObject 
        self.allPhotos = PHAsset.fetchAssets(in: assetCollection, options: nil)
    

【讨论】:

以上是关于如何按使用 fetchAssets 添加的日期顺序获取 PHAsset的主要内容,如果未能解决你的问题,请参考以下文章

如何按添加日期组织 icloud 数据?

如何按特定顺序从 select 中执行 Oracle SQL 更新?

如何按时间顺序列出文件?

使用 Union All 按日期顺序回显 SQL 数据

SQL多表联合查询按日期排序

SQL如何按条件取唯一值?