ios - 取消通过操作启动的 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!)
}
}
解决方案
好吧,在马特评论之后,我在调用 cancelImageRequest(requestId) 的操作中添加了一个公共方法。似乎工作正常!(调用cancelImageRequest时一定要调用cancel方法,否则会出现Task错误!)
func cancelImageRequest() {
if let requestId = requestId {
HomeViewController.imageManager.cancelImageRequest(requestId)
}
}
推荐阅读
- node.js - 是否可以判断 writeFile 是否在 NodeJS 中创建了一个新文件?
- python - 变长整数编码
- linux - 从 Docker 容器中的 txt 文件生成 SSH KEY
- php - 用php在字符串中查找变量的x实例
- sql - SQL 可选 NULL 值
- ios - 我的小部件似乎没有安装到我的 Xcode 12 模拟器上
- reactjs - 在 React Expo 中添加使用位置的权限
- python - 如何在 python 中调用多个库,然后等待所有库加载后再继续?
- netlogo - 如何将乌龟的局部变量与其邻居进行比较
- xamarin.forms - 无法在 Xamarin Forms 上建立 SSL 连接