【问题标题】:Not possible to loop over PHFetchResult with ForEach无法使用 ForEach 循环 PHFetchResult
【发布时间】:2020-07-05 19:45:15
【问题描述】:

我目前正在开发适用于 iOS / macOS 的照片应用程序,我正在努力使用 PhotoKit。

我确实创建了一个类来管理我的所有 PhotoKit 请求。

class PhotosAPI: ObservableObject {

@Published var all = PHFetchResult<PHAsset>()
@Published var allAlbums = PHFetchResult<PHAssetCollection>()
@Published var allSmartAlbums = PHFetchResult<PHAssetCollection>()

// Functions to get the Collections / Assets

}

到目前为止,这部分工作正常,但现在我正在努力在我的视图中显示这些数据。

在我看来,我想在列表/网格中显示所有资产

struct ShowImages: View {

    @ObservedObject var photos = PhotosAPI()

    var body: some View {
        List(photos.all, id: \.self) { item in
            Text("\(item)")
        }
    }
}

但我确实收到一个错误“初始化程序'init(_:id:rowContent:)' 要求'PHFetchResult' 符合'RandomAccessCollection'”,我今天确实尝试了一整天来解决这个问题,但我没有成功并且我在 google 中找不到任何有用的东西。

有人知道我如何让 PHFetchResults 遍历它们吗?

最后我能够用下面的代码显示图片。但这对我来说似乎是非常糟糕的代码。我宁愿直接在 PHFetchResult 上循环。有谁知道我怎样才能做到这一点?

ForEach(0..<photos.all.count) { index in
    Text("\(photos.all.object(at: index).localIdentifier)")
}  

       

【问题讨论】:

  • 您可以尝试使PHFetchResult 符合RandomAccessCollection 或存储PHAsset 的数组而不是PHFetchResults。如果您遇到性能问题,可以使用 iOS 14 中的一种新惰性视图或对照片进行分页。

标签: swift xcode swiftui photokit


【解决方案1】:

您可以为PHFetchResult 实现RandomAccessCollection 或创建符合RandomAccessCollection 的包装器。

struct PHFetchResultCollection: RandomAccessCollection, Equatable {

    typealias Element = PHAsset
    typealias Index = Int

    let fetchResult: PHFetchResult<PHAsset>

    var endIndex: Int { fetchResult.count }
    var startIndex: Int { 0 }

    subscript(position: Int) -> PHAsset {
        fetchResult.object(at: fetchResult.count - position - 1)
    }
}

然后你就可以使用PHFetchResultCollectionForEach

let collection = PHFetchResultCollection(fetchResult: fetchResult)

var body: some View  {
    ForEach(collection, id: \.localIdentifier) {
        ...
    }
}

【讨论】:

  • 如果有人需要一个用于 PHAssetCollection 的相同代码,只需将 PHAsset 替换为 PHAssetCollection,创建一个单独的 PHFetchResultAssetCollection 结构即可。
【解决方案2】:

您可以使用enumerate 方法枚举获取的结果对象的项目,例如这个:

https://developer.apple.com/documentation/photokit/phfetchresult/1620999-enumerateobjects

【讨论】:

  • 如果它让你感觉更好,我认为你不能使用for...in 是一个错误。这是因为这是一个通用对象。
  • 看起来 PhotoKit 不能很好地与 SwiftUI 一起使用。我目前正在尝试枚举获取结果并将所有 localIdentifier 写入一个字符串数组,然后在视图中遍历 localIdentifier 的方法。但这有一些性能问题,尤其是在大型照片库上
  • 可能是这样,但我相信实际的问题是如何循环获取结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多