RequestImage 的结果处理程序调用了两次
Posted
技术标签:
【中文标题】RequestImage 的结果处理程序调用了两次【英文标题】:RequestImage's result handler called twice 【发布时间】:2017-09-05 12:39:07 【问题描述】:我有一组图像资源。我必须将这些资产转换为图像,将它们添加到数组中并将它们上传到 Firebase 数据库。我有两个问题。
问题 1:
在自定义 UICollectionViewCell
中,我显示用户选择的所有图像,当我从照片中选择 4 张图像时,我在单元格中看到 4 张图像(我正在使用自定义框架)。现在,当我调用requestImage
方法时,我得到了数组中图像数量的两倍,这些图像应该从资产数组转换每个资产并将其存储到名为assetsTurnedIntoImages
的UIImage
数组中。我阅读了更多关于它的信息,它与PHImageRequestOptions
有关,如果它的isSynchronous
属性返回true
或false
,或者PHImageRequestOptions
是nil
。现在,显然我没有得到任何东西,因为我的代码仍然无法正常工作。
问题 2:
从下面的代码中可以看出,targetSize
给了我一个缩略图大小。当我将图像上传到存储时,我不需要缩略图,我需要它的原始大小。如果我将其设置为 PHImageManagerMaximumSize
我会收到错误消息:
“与 assetsd 的连接被中断或 assetsd 死了”
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
【问题讨论】:
“由于内存警告,与 assetsd 的连接被中断或 assetsd 死亡”,在 memorywarning 方法上设置断点,或者您可以查看此链接:***.com/a/28494077/3400991,如果您有同样的问题,请随时发表评论 【参考方案1】:为避免完成处理程序的两次调用,只需在此请求中添加一个选项使其同步
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
)
为避免加载图像时崩溃,您应该压缩图像或减小其大小以便进一步工作
【讨论】:
以上是关于RequestImage 的结果处理程序调用了两次的主要内容,如果未能解决你的问题,请参考以下文章
本地通知“didReceiveLocalNotification”调用了两次
DelegatingFilterProxy 在没有 Spring Security 的 Spring MVC 应用程序上调用了两次