ios - 如何正确使用带有本地标识符的获取资产?
问题描述
我试图弄清楚如何获取标识符数组并将它们以编程方式放入集合视图中。如果我错了,请纠正我,但我相信最好的方法是使用PHAsset.fetchAssets
. 我最多预计用户会获取 10 张图像(平均 3-4 张),所以我认为这个过程不会占用大量资源。我正在使用特定的标识符数组测试下面的代码。在我分配资产的行上的 cellForItemAt 函数中,我收到一条错误消息。请参阅该行上方的评论。我在 SO 上看到过类似的问题,但我无法应用我发现的任何内容。我究竟做错了什么?
var identifier: [String] = ["83BDF9C0-E1FB-4F68-9F2C-99649A67E218/L0/001", "18D08CEC-4075-4488-BFD1-E9403B214356/L0/001", "74257416-6D9C-48B2-9CE0-C23B56CB4171/L0/001", "2EA7CACE-9B9B-4FC9-ABC5-03BCE2BDAA2A/L0/001", "46A4CD2B-4FEB-4BBE-86DC-B79ED49BC300/L0/001", "E4290EB0-2B16-46AE-9B98-83379F6128F3/L0/001", "7C0B36FF-320D-4083-92E4-5A1F464FFFB1/L0/001", "DEE1414C-2B92-4147-8C3C-A1775FB324AD/L0/001"]
class DetailViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{
var myCollectionView: UICollectionView!
let imgManager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
var fetchResult: PHFetchResult<PHAsset>!
override func viewDidLoad() {
requestOptions.isSynchronous = false
requestOptions.deliveryMode = .opportunistic
let layout = UICollectionViewFlowLayout()
myCollectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
myCollectionView.delegate = self
myCollectionView.dataSource = self
myCollectionView.backgroundColor = UIColor.white
myCollectionView.allowsMultipleSelection = true
myCollectionView.register(ImageEditCell.self, forCellWithReuseIdentifier: "Cell")
myCollectionView.showsVerticalScrollIndicator = false
self.view.addSubview(myCollectionView)
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! ImageEditCell
cell.representedAssetIdentifier = identifier[0]
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = false
// LINE BELOW PRODUCES ERROR: Cannot convert value of type '[String]' to expected element type 'Array<String>.ArrayLiteralElement' (aka 'String')
let asset = PHAsset.fetchAssets(withLocalIdentifiers: [identifier], options: .none).firstObject
imgManager.requestImage(for: asset!, targetSize: CGSize(width:120, height: 120),
contentMode: .aspectFill,
options: requestOptions,
resultHandler: { result, info in
if cell.representedAssetIdentifier == self.identifier {
cell.imageview.image = result
}
})
}
}
解决方案
在这里,我已将 fetch 函数移至 viewDidLoad 以防止其他错误,而且我不确定您要获取的内容是否是带有图像的数组(如果是这样,那么通过放置 .firstObject 您正在获取单个图像,这可能会导致错误)
var identifier: [String] = ["83BDF9C0-E1FB-4F68-9F2C-99649A67E218/L0/001", "18D08CEC-4075-4488-BFD1-E9403B214356/L0/001", "74257416-6D9C-48B2-9CE0-C23B56CB4171/L0/001", "2EA7CACE-9B9B-4FC9-ABC5-03BCE2BDAA2A/L0/001", "46A4CD2B-4FEB-4BBE-86DC-B79ED49BC300/L0/001", "E4290EB0-2B16-46AE-9B98-83379F6128F3/L0/001", "7C0B36FF-320D-4083-92E4-5A1F464FFFB1/L0/001", "DEE1414C-2B92-4147-8C3C-A1775FB324AD/L0/001"]
class DetailViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{
var myCollectionView: UICollectionView!
let imgManager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
var fetchResult: PHFetchResult<PHAsset>!
override func viewDidLoad() {
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = false
let layout = UICollectionViewFlowLayout()
myCollectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
myCollectionView.delegate = self
myCollectionView.dataSource = self
myCollectionView.backgroundColor = UIColor.white
myCollectionView.allowsMultipleSelection = true
myCollectionView.register(ImageEditCell.self, forCellWithReuseIdentifier: "Cell")
myCollectionView.showsVerticalScrollIndicator = false
self.view.addSubview(myCollectionView)
let asset = PHAsset.fetchAssets(withLocalIdentifiers: [identifier], options: .none)
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! ImageEditCell
cell.representedAssetIdentifier = identifier[indexPath.row]
imgManager.requestImage(for: asset!, targetSize: CGSize(width:120, height: 120),
contentMode: .aspectFill,
options: requestOptions,
resultHandler: { result, info in
if cell.representedAssetIdentifier == self.identifier {
cell.imageview.image = result
}
})
}
}
推荐阅读
- mysql - MySQL 8.0.17 版中使用 Pivot 的行到列转换
- node.js - 使用 sequelize raw 查询在 postgresql 中获取插入的表 ID
- java - 如何在 Oracle 中生成 ID?
- javascript - 从 html 表创建 excel
- c++ - OpenGL 1 像素高纹理渲染差异 Windows/Linux vs OS X
- c++ - 推断回调参数类型并将它们用作返回类型
- foreach - SwiftUI 在 Foreach 中获得位置
- mongodb - MongoDB管道查询投影(聚合)可以不区分大小写吗?
- pine-script - Tradingview pine 脚本提醒 wunderbit
- mysql - 如果查询中的日期时间有时区,MariaDB MySQL 查询要长得多,但如果没有添加时区,则非常快 - 为什么?