取消通过操作启动的PHImageRequest

时间:2020-03-31 18:15:45

标签: ios swift

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

我提出了一个解决方案,但是只有很短的时间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!)
        }
    }

1 个答案:

答案 0 :(得分:1)

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

func cancelImageRequest() {
    if let requestId = requestId {
        HomeViewController.imageManager.cancelImageRequest(requestId)
    }
}
相关问题