我有一个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!)
}
}
答案 0 :(得分:1)
好吧,在matt条评论之后,我在Operation中添加了一个调用cancelImageRequest(requestId)的公共方法。似乎工作正常! (一定要在调用cancelImageRequest时也调用cancel方法,否则会出现一些Task错误!)
func cancelImageRequest() {
if let requestId = requestId {
HomeViewController.imageManager.cancelImageRequest(requestId)
}
}