首页 > 解决方案 > 取消通过操作启动的 PHImageRequest

问题描述

我有一个 OperationQueue,我在其中启动多个 PHImageRequest 以加载图像(通过操作)。但是如果我不再需要图像(图像在 collectionView 中),我想取消请求。最初我想看 isCancelled 变量,但这是不可能的,因为我无法覆盖它......我试图在请求未完成时在循环请求之后放置一个循环,并检查 isCancelled 是否为真,如果是,它取消图像请求(我摆脱了这个解决方案,它导致了太多的错误,图像没有加载..)。

我想出了一个解决方案,但是isCancelled可以取消图像请求的时间很短。

如果有人有适当的方法来取消请求,我在这里谢谢!

第一个想法(循环):

override func start() {
        if isCancelled { return }
        var imageRequested = true

        requestId = HomeViewController.imageManager.requestImage(
            for: mAsset.phasset,
            targetSize: CGSize(width: 200, height: 200),
            contentMode: .default,
            options: UIConstants.fastAssetRequestOptions,
            resultHandler: { [weak self] (result, _) -> Void in
                guard let self = self else { return }
                guard let result = result else { return }
                self.image = result

                imageRequested = false              

                if let loadingCompleteHandler = self.imageLoadingCompleteHandler {
                    DispatchQueue.main.async {
                        loadingCompleteHandler(result)
                    }
                }
            }
        )
        while imageRequested {
            if isCancelled && requestId != nil {
                manager.cancelImageRequest(requestId!)
                requestId = nil
            }
        }
    }

第二个想法(当前解决方案):

override func start() {
        if isCancelled { return }        
        requestId = HomeViewController.imageManager.requestImage(
            for: mAsset.phasset,
            targetSize: CGSize(width: 200, height: 200),
            contentMode: .default,
            options: UIConstants.fastAssetRequestOptions,
            resultHandler: { [weak self] (result, _) -> Void in
                guard let self = self else { return }
                guard let result = result else { return }
                self.image = result

                if let loadingCompleteHandler = self.imageLoadingCompleteHandler {
                    DispatchQueue.main.async {
                        loadingCompleteHandler(result)
                    }
                }
            }
        )

        if(isCancelled && (requestId != nil)) {
            HomeViewController.imageManager.cancelImageRequest(requestId!)
        }
    }

标签: iosswift

解决方案


好吧,在马特评论之后,我在调用 cancelImageRequest(requestId) 的操作中添加了一个公共方法。似乎工作正常!(调用cancelImageRequest时一定要调用cancel方法,否则会出现Task错误!)

func cancelImageRequest() {
    if let requestId = requestId {
        HomeViewController.imageManager.cancelImageRequest(requestId)
    }
}

推荐阅读