RequestImage 的结果处理程序调用了两次

Posted

技术标签:

【中文标题】RequestImage 的结果处理程序调用了两次【英文标题】:RequestImage's result handler called twice 【发布时间】:2017-09-05 12:39:07 【问题描述】:

我有一组图像资源。我必须将这些资产转换为图像,将它们添加到数组中并将它们上传到 Firebase 数据库。我有两个问题。

问题 1:

在自定义 UICollectionViewCell 中,我显示用户选择的所有图像,当我从照片中选择 4 张图像时,我在单元格中看到 4 张图像(我正在使用自定义框架)。现在,当我调用requestImage 方法时,我得到了数组中图像数量的两倍,这些图像应该从资产数组转换每个资产并将其存储到名为assetsTurnedIntoImagesUIImage 数组中。我阅读了更多关于它的信息,它与PHImageRequestOptions 有关,如果它的isSynchronous 属性返回truefalse,或者PHImageRequestOptionsnil。现在,显然我没有得到任何东西,因为我的代码仍然无法正常工作。

问题 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 的结果处理程序调用了两次的主要内容,如果未能解决你的问题,请参考以下文章

jQuery click 事件处理程序为复选框调用了两次

OnLoadFinished() 调用了两次

asp中GridView的选择为啥被调用了两次

本地通知“didReceiveLocalNotification”调用了两次

NgHttp2 调用请求数据处理程序两次,针对一个请求

DelegatingFilterProxy 在没有 Spring Security 的 Spring MVC 应用程序上调用了两次