vc1在vc2和vc2中推送。
在vc2中,我有一个字符串数组,我将这些字符串转换为最终通过URLSession的url,返回的图像将转换为带有过滤器的图像。在URLSession回调中获得过滤的图像后,将其保存到缓存中。
我希望返回的经过过滤的图像以字符串数组中的确切顺序显示。我遵循了此答案,并使用DispatchGroup + Semaphores,并且一切正常,按正确的顺序返回了过滤图像的顺序
我遇到的问题是,如果用户返回到vc1,然后再推入vc2,一旦下面的代码运行并看到缓存具有第一个已过滤的图像(“ str1”),它将添加到filteredArray并跳转到 dispatchGroup.notify
。与数组中“ str1”关联的已过滤图像是唯一附加的东西,而“ str2”和“ str3”中的图像则没有。
高速缓存可能已清除或未清除与“ str2”,“ str3”关联的已过滤图像,如果已清除它们,则循环应继续进行URLSession回调,但不会。但是,如果不清除它们,也不会添加它们。 这就是我的问题所在,一旦命中了缓存,循环就会停止运行。这是我第一次使用信号量,所以我不确定问题出在哪里。
我要解决此问题的方法是,我只是删除了缓存,并且一切正常,但这也意味着我没有从使用缓存中受益。
let imageCache = NSCache ()
让arrOfStringsAsUrls = [“ str1”,“ str2”,“ str3”,“也许还有更多的字符串...”]
varfilteredArray = [UIImage]()
让dispatchGroup = DispatchGroup()
让dispatchQueue = DispatchQueue(label:“ any-label-name”)
让dispatchSemaphore = DispatchSemaphore(值:0)
dispatchQueue.async {
for arrOfStringsAsUrls {
dispatchGroup.enter()
保护让url = URL(string:str)else {
dispatchSemaphore.signal()
dispatchGroup.leave()
返回
}
如果让cachedImage = imageCache.object(forKey:str as AnyObject)为? UIImage {
自我?.filteredArray.append(cachedImage)
dispatchSemaphore.signal()
dispatchGroup.leave()
返回
}
URLSession.shared.dataTask(with:url,completeHandler:{(数据,响应,错误)在
如果让错误=错误{
dispatchSemaphore.signal()
dispatchGroup.leave()
返回
}
保护让数据=数据,让图像= UIImage(数据:数据)其他{
dispatchSemaphore.signal()
dispatchGroup.leave()
返回
}
DispatchQueue.main.async {[弱自我]
让filterImage = self?.addFilterToImage(image)
self?.imageCache.setObject(image,forKey:str作为AnyObject)
自我?.filteredArray.append(filteredImage)
dispatchSemaphore.signal()
dispatchGroup.leave()
}
})。恢复()
dispatchSemaphore.wait()
}
dispatchGroup.notify(queue:dispatchQueue){在
// reloadData()并在主队列上执行其他操作
}
}
答案 0 :(得分:0)
在第二次VC的第一次推送期间,所有图像均不在缓存中,因此没有其他防护措施触发,也if let cachedImage = imageCache...
使得一切顺利进行,在下一次推送之后,缓存中已存储了图像,因此如果让我们触发了>
if let cachedImage = imageCache.object(forKey: str as AnyObject) as? UIImage {
....
return
}
并且由于您放置了return
语句,它将导致for循环和函数的退出,从而导致随后的图像捕获结束,由于存在相等的{那时的{1}} / enter
,您真正需要的是在缓存中存储有图像或url错误以阻止其通过会话进行获取,并且在for循环中完成此工作的最佳方法是leave
关键字将跳过当前迭代并跳至下一个迭代
continue