我有一系列图像资产。我必须将这些资源转换为图像,将它们添加到阵列并将它们上传到Firebase数据库。我有2个问题。
问题1:
在自定义UICollectionViewCell
中,我显示用户选择的所有图像,当我从照片中选择4个图像时,我在单元格中看到4个图像(我正在使用自定义框架)。现在,当我调用requestImage
方法时,我得到的数量是图像中的两倍,它应该从资产数组中转换每个资产并将其存储到名为UIImage
的assetsTurnedIntoImages
数组中。我读了更多关于它,它与PHImageRequestOptions
有关,如果它的isSynchronous
属性返回true
或false
,那或如果PHImageRequestOptions
是nil
。现在,显然我没有得到什么,因为我的代码仍然不起作用。
问题2:
从下面的代码中可以看出,targetSize
给了我一个略微缩略图的大小。当我将图像上传到存储空间时,我不需要缩略图,我需要它的原始大小。如果我将它设置为PHImageManagerMaximumSize
我收到一个错误:
“资产连接中断或资产死亡”
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoPostCVCell", for: indexPath) as! PhotoPostCVCell
if let takenImage = cameraPhotoUIImage
{
cell.cellImage.image = takenImage
}
if assets.count > 0
{
let asset = assets[indexPath.row]
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true // synchronous works better when grabbing all images
requestOptions.deliveryMode = .opportunistic
imageManager.requestImage(for: asset, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFill, options: requestOptions)
{ (image, _) in
DispatchQueue.main.async {
print("WE ARE IN")
cell.cellImage.image = image!
self.assetsTurnedIntoImages.append(image!)
}
}
}
return cell
}
要避免完成处理程序的两次调用,只需在此请求中添加一个选项以使其同步
let options = PHImageRequestOptions()
options.isSynchronous = true
let asset: PHAsset = self.photoAsset?[indexPath.item] as! PHAsset
PHImageManager.default().requestImage(for: asset, targetSize: CGSize(width: 1200, height: 1200), contentMode: .aspectFit, options: options, resultHandler: {(result, info) in
if result != nil {
//do your work here
}
})
为避免加载图像时出现崩溃,您应该压缩图像或缩小图像以进行进一步的工作