我有一个函数,它运行一个循环,trigers为循环中的每个项运行另一个函数,但是它似乎没有数组中的项多运行这个函数的次数。
这是我的功能。
func startLoop(completion: @escaping (_ finished: Bool) -> ()) {
print("Tony items amount is \(tempImgUrls.count)")
for item in tempImgUrls {
dispatchGroup.enter()
print("Tony begin loop")
let img = item["imgUrl"]
let name = item["name"]
downloadImages(img: img!, name: name!, completion: { (complete) in
print("Tony mid loop")
self.dispatchGroup.leave()
})
}
dispatchGroup.notify(queue: DispatchQueue.main) {
print("Tony end loop")
completion(true)
}
}
func downloadImages(img: String, name: String, completion: @escaping (_ finished: Bool) -> ()) {
imageShown.sd_setImage(with: URL(string: img), completed: { (image, error, cacheType, imageUrl) in
let personImg = image!
let personId = name
let post = Person(personImage: personImg, personId: personId)
self.finalImgUrls.append(post)
completion(true)
print("Tony array is with images person is \(self.finalImgUrls)")
print("Tony items 2 amount is \(self.finalImgUrls.count)")
})
}
}这是在consol中的打印,你可以看到它首先打印循环开始,然后中间1次和结束1次,在末尾附加一个项目,而不是像输入的那样4。
托尼项目的金额是4 托尼贝京循环 托尼贝京循环 托尼贝京循环 托尼贝京循环 托尼中环 Tony是带图像的person是AppName.Person 托尼项目2的金额是1
发布于 2018-11-16 19:59:43
你所拥有的代码正在起作用。问题似乎是sd_setImage只交付了一次结果。
如何测试
如果您使用sd_setImage的测试实现如下所示,那么您将得到预期的结果:
class SomeClass {
func sd_setImage(with url: URL?, completed: @escaping (UIImage?, Error?, String, URL) -> Void) {
let random = Double(arc4random()) / Double(UINT32_MAX)
DispatchQueue.main.asyncAfter(deadline: .now() + random, execute: {
completed(UIImage(), nil, "a", url!)
})
}
}发布于 2019-01-07 19:24:39
当您使用UIImageView异步图像检索扩展时,当为同一图像视图请求另一个图像时,它们总是会取消对该图像视图的先前请求。(这通常是通过设计实现的,因为它可以防止对不再需要的同一图像视图(例如表视图单元格中的图像视图)的先前图像请求积压。)
问题是,如果取消图像检索,SDWebImage的UIImageView扩展不会调用其完成处理程序。这是一个API设计缺陷,IMHO,因为异步方法应该总是调用它们的完成处理程序(如果请求被取消,则使用“已取消”错误代码)。但是由于SDWebImage没有这样做,您的循环的初始请求将被取消以代替后续的请求,因此,您对早期迭代的leave调用永远不会被调用。FYI、其他映像库(如翠鸟 )不受此设计缺陷的影响(尽管它有自己的问题)。
但这就引出了你的意图的问题。例如,如果您想要连续地查看图像序列,那么在完成前一个图像检索之前,不应该启动下一个图像检索(例如,在上一个图像的完成处理程序中启动下一个图像检索)。或者,您应该自己检索映像(而不是使用取消先前请求的UIImageView扩展),并在那里对UI进行一些定时更新。但是,您几乎肯定不希望为同一个图像视图启动多个并发图像更新。
https://stackoverflow.com/questions/53343019
复制相似问题