Ios 立即调用DispatchGroup notify()-不等待进入/离开
我已经被这个问题困扰了一段时间了,我已经没有有用的谷歌搜索结果了 我有两个请求,第一个请求从服务器检索一些链接,另一个请求我从链接下载图像。下载完所有图像后,我将结果返回给视图控制器 Int从UIViewController调用代码Ios 立即调用DispatchGroup notify()-不等待进入/离开,ios,swift,Ios,Swift,我已经被这个问题困扰了一段时间了,我已经没有有用的谷歌搜索结果了 我有两个请求,第一个请求从服务器检索一些链接,另一个请求我从链接下载图像。下载完所有图像后,我将结果返回给视图控制器 Int从UIViewController调用代码requestBanners(),进入调度组。理论上,在离开调度组之前,应该为我从服务器获得的每个url调用storeImage(),并且在每次调用时,它应该进入和离开调度组,将图像添加到数组中。下载完所有图像后,它将离开调度组,并在UIViewController上
requestBanners()
,进入调度组。理论上,在离开调度组之前,应该为我从服务器获得的每个url调用storeImage()
,并且在每次调用时,它应该进入和离开调度组,将图像添加到数组中。下载完所有图像后,它将离开调度组,并在UIViewController上启动notify()
以执行setUpCollection()
使用print()
作为指导,查看实际发生的情况,我得到:
我正在下载网址
现在我在UIViewController中
(此print()
在setUpCollection()的实现中调用)
我正在下载一张图片
它实际上应该下载URL,然后下载图像,然后才返回UIViewController
起初我使用了信号量,但后来我认为使用调度组将是一个更干净的解决方案
在这两种方法中,在完成图像下载之前返回空的bannersArr。也许那张紧凑的地图把一切都搞砸了
代码如下:
class BannersHelper{
私有变量bannersArr:[UIImage]=[]
私有let dispatchGroup=dispatchGroup()
私有变量委托:LoadBanner?=nil
初始化(代理:加载横幅){
self.delegate=委托
dispatchGroup.notify(队列:.main){
self.delegate?.setUpCollection(错误:self.bannersArr)
}
}
func请求横幅(){
打印(“我正在下载URL\n”)
self.dispatchGroup.enter()
getBanners(处理程序:{response in
guard let BannerResponse=响应为?BannerModel else{
返回
}
让banners=bannersResponse.data as![DataBannerModel]
let=banners.compactMap({self.storeImage(model:$0)})
self.dispatchGroup.leave()
})
}
专用func storeImage(型号:DataBannerModel){
打印(“我正在下载图像\n”)
self.dispatchGroup.enter()
ServiceParameteria.getImage(url:model.urlImagen!,处理程序:{结果为
让image=结果为!UIImage
self.bannersArr.append(图像)
self.dispatchGroup.leave()
})
}
}
是否有更好的方法来执行此操作,或者我只是错误地使用了调度组?正如@pkamb在评论中指出的,问题是我试图在init()
方法中启动dispatchGroup.notify()
在执行时,由于我还没有调用requestBanners()
,DispatchGroup计数器等于零,这导致提前调用带有空数组的delegate?.setUpCollection()
移动dispatchGroup.notify()
方法末尾的requestBanners()
块解决了问题:)目标是在继续之前下载所有图像,还是在继续之前按特定顺序下载所有图像?目标是在获得URL后开始下载URL,开始下载存储在该url中的图像,当所有图像下载完毕后,我才应该返回图像数组。我会编辑这个问题,也许问题不太清楚,那么调度组就是解决的办法。你用错了,但这是正确的机制。这是否回答了你的问题?即使稍后从VC调用requestbanner()
,也为时已晚。dispatchGroup.notify
将在init
中以空横幅数组启动。它不会在以后自动重新发射。。。一旦。。。在本例中,它立即位于init()
中。您需要将notify()
移动到requestbanner()
函数的末尾。