我有一个集合视图,用于显示所有用户的照片。基本的东西,数据源通过获取 PHAssets 并在 PHCachingImageManager
上使用 requestImage
来加载缩略图。
但是最近我收到了一个错误报告,当您拥有超过 5000 张图像并快速浏览时,UI 会冻结。经过调查,我能够重现此问题,并且似乎主线程在调用 requestImage
后被锁定 (_lock_wait),而由该调用创建的数十个其他线程(用于其他单元格的缩略图)也被锁定等待谁知道什么。
我尝试了几个方法都不起作用:
实现了
UICollectionViewDataSourcePrefetching
,并在prefetchItemsAt
事件上使用PHCachingImageManager
开始缓存图像。有趣的是,它使事情变得更糟,因为它尝试一次加载更多的图像。而且当单元格离开屏幕时应该调用的cancelPrefetchingForItemsAt
从未被调用。尝试在较慢的请求上调用
cancelImageRequest
,也没有成功。
现在我不知道还能做什么,我可以在后台 dispatch_queue 上运行 requestImage
,这样它就不会锁定我的主线程,但是感觉很奇怪,因为该方法本身将生成另一个线程。
我的代码大致如下:
let requestOptions = PHImageRequestOptions()
requestOptions.resizeMode = .fast
requestOptions.deliveryMode = .opportunistic
requestOptions.isSynchronous = false
requestOptions.isNetworkAccessAllowed = true
return requestOptions
myManager.requestImage(for: asset, targetSize: CGSize(width: 375, height: 375), contentMode: .aspectFill, options: options) { /* use image */ }
PS: 我不确定,但似乎这只发生在iOS 11上,目前我只能在iPhone X上复制